[
  {
    "path": ".github/workflows/rust.yml",
    "content": "name: Rust\n\non:\n  push:\n    branches:\n      - main\n  pull_request:\n    branches:\n      - main\n  workflow_dispatch:\n\nenv:\n  CARGO_TERM_COLOR: always\n\njobs:\n  build-linux:\n    runs-on: ubuntu-latest\n\n    env:\n      DEBIAN_FRONTEND: noninteractive\n\n    strategy:\n      fail-fast: false # don't give up on the whole matrix if one variant fails\n      matrix:\n        linkage:\n          - static\n          - shared\n        library:\n          - hidraw\n          - libusb\n\n    steps:\n      - name: Checkout repository and submodules\n        uses: actions/checkout@v4\n        with:\n          submodules: recursive\n      - name: Install dependencies\n        run: |\n          sudo apt-get update -y\n          sudo apt-get install -y cmake libudev-dev libumockdev-dev umockdev\n      - name: Install Rust toolchain\n        uses: dtolnay/rust-toolchain@stable\n      - name: Build libusb\n        run: |\n          git clone https://github.com/libusb/libusb.git ./etc/libusb/\n          cd ./etc/libusb/\n          ./autogen.sh\n          make\n          sudo make install\n          cd -\n          rm -rf ./etc/libusb/\n      - name: Build hidapi\n        run: |\n          cd ./etc/hidapi/\n          mkdir ./build/\n          cd ./build/\n          cmake ..\n          make\n          sudo make install\n      - name: List pkgconfig definitions\n        run: grep -RHn ^ /usr/local/lib/pkgconfig\n      - name: Build\n        run: cargo build --no-default-features --features linux-${{ matrix.linkage }}-${{ matrix.library }} --verbose\n      - name: Run tests\n        run: cargo test --no-default-features --features linux-${{ matrix.linkage }}-${{ matrix.library }} --verbose\n      - name: Verify package\n        run: |\n          cargo package --no-default-features --features linux-${{ matrix.linkage }}-${{ matrix.library }} --verbose\n\n  build-linux-native:\n    runs-on: ubuntu-latest\n    env:\n      DEBIAN_FRONTEND: noninteractive\n    steps:\n      - name: Checkout repository and submodules\n        uses: actions/checkout@v4\n        with:\n          submodules: recursive\n      - name: Install dependencies\n        run: |\n          sudo apt-get update -y\n          sudo apt-get install -y libudev-dev\n      - name: Install Rust toolchain\n        uses: dtolnay/rust-toolchain@stable\n      - name: Build\n        run: cargo build --no-default-features --features linux-native --verbose\n      - name: Run tests\n        run: cargo test --no-default-features --features linux-native --verbose\n      - name: Verify package\n        run: cargo package --no-default-features --features linux-native --verbose\n\n  build-linux-native-basic-udev:\n    runs-on: ubuntu-latest\n    env:\n      DEBIAN_FRONTEND: noninteractive\n    steps:\n      - name: Checkout repository and submodules\n        uses: actions/checkout@v4\n        with:\n          submodules: recursive\n      - name: Install dependencies\n        run: |\n          sudo apt-get update -y\n          sudo apt-get install -y libudev-dev\n      - name: Install Rust toolchain\n        uses: dtolnay/rust-toolchain@stable\n      - name: Build\n        run: cargo build --no-default-features --features linux-native-basic-udev --verbose\n      - name: Run tests\n        run: cargo test --no-default-features --features linux-native-basic-udev --verbose\n      - name: Verify package\n        run: cargo package --no-default-features --features linux-native-basic-udev --verbose\n\n  build-windows:\n    runs-on: windows-latest\n    steps:\n      - name: Checkout repository and submodules\n        uses: actions/checkout@v4\n        with:\n          submodules: recursive\n      - name: Install Rust toolchain\n        uses: dtolnay/rust-toolchain@stable\n      - name: Build\n        run: cargo build --no-default-features --verbose\n      - name: Run tests\n        run: cargo test --no-default-features --verbose\n      - name: Verify package\n        run: cargo package --no-default-features --verbose\n\n  build-windows-native:\n    runs-on: windows-latest\n    steps:\n      - name: Checkout repository and submodules\n        uses: actions/checkout@v4\n        with:\n          submodules: recursive\n      - name: Install Rust toolchain\n        uses: dtolnay/rust-toolchain@stable\n      - name: Build\n        run: cargo build --no-default-features --features windows-native --verbose\n      - name: Run tests\n        run: cargo test --no-default-features --features windows-native --verbose\n      - name: Verify package\n        run: cargo package --no-default-features --features windows-native --verbose\n\n  build-linux-on-windows:\n    runs-on: windows-latest\n    steps:\n      - name: Checkout repository and submodules\n        uses: actions/checkout@v4\n        with:\n          submodules: recursive\n      - name: Install Rust toolchain\n        uses: dtolnay/rust-toolchain@stable\n      - name: Install Linux target\n        run: rustup target add arm-unknown-linux-musleabihf\n      - name: Build\n        run: cargo build --target arm-unknown-linux-musleabihf --no-default-features --features linux-native-basic-udev --verbose\n      - name: Verify package\n        run: cargo package --target arm-unknown-linux-musleabihf --no-default-features --features linux-native-basic-udev --verbose\n\n  build-macos:\n    runs-on: macos-latest\n    steps:\n      - name: Checkout repository and submodules\n        uses: actions/checkout@v4\n        with:\n          submodules: recursive\n      - name: Install Rust toolchain\n        uses: dtolnay/rust-toolchain@stable\n      - name: Build\n        run: cargo build --no-default-features --verbose\n      - name: Run tests\n        run: cargo test --no-default-features --verbose\n      - name: Verify package\n        run: cargo package --no-default-features --verbose\n\n  fmt-check:\n    runs-on: ubuntu-latest\n\n    env:\n      DEBIAN_FRONTEND: noninteractive\n\n    steps:\n      - name: Checkout repository and submodules\n        uses: actions/checkout@v4\n        with:\n          submodules: recursive\n      - name: Install Rust toolchain\n        uses: dtolnay/rust-toolchain@stable\n        with:\n          components: rustfmt\n      - name: Check code formatting\n        run: cargo fmt --check\n"
  },
  {
    "path": ".gitignore",
    "content": "target\nCargo.lock\n.idea/\nhidapi-rs.iml\n.helix/\n.vscode/\n"
  },
  {
    "path": ".gitmodules",
    "content": "[submodule \"etc/hidapi\"]\n\tpath = etc/hidapi\n\turl = https://github.com/libusb/hidapi.git\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: rust\n\n\nmatrix:\n  include:\n    - env: TARGET=x86_64-unknown-linux-gnu FEATURE_FLAGS=\"linux-static-libusb\"\n\n    - env: TARGET=x86_64-unknown-linux-gnu FEATURE_FLAGS=\"linux-static-hidraw\"\n\n    - env: TARGET=x86_64-unknown-linux-gnu FEATURE_FLAGS=\"linux-shared-libusb\"\n\n    - env: TARGET=x86_64-unknown-linux-gnu FEATURE_FLAGS=\"linux-shared-hidraw\"\n\n    - env: TARGET=x86_64-apple-darwin\n      os: osx\n\n\nscript:\n  - cargo build --verbose --no-default-features --features=\"${FEATURE_FLAGS}\"\n  - cargo test --verbose --no-default-features --features=\"${FEATURE_FLAGS}\"\n\naddons:\n  apt:\n    packages:\n      - libusb-1.0-0-dev\n      - libudev-dev\n      - libhidapi-dev"
  },
  {
    "path": "Cargo.toml",
    "content": "[package]\nname = \"hidapi\"\nversion = \"2.6.5\"\nauthors = [\n    \"Roland Ruckerbauer <mail@ruabmbua.dev>\",\n    \"Osspial <osspial@gmail.com>\",\n    \"Artyom Pavlov <newpavlov@gmail.com>\",\n    \"mberndt123\",\n    \"niklasad1\",\n    \"Stefan Kerkmann\"\n]\nrepository = \"https://github.com/ruabmbua/hidapi-rs\"\ndescription = \"Rust-y wrapper around hidapi\"\nlicense = \"MIT\"\nkeywords = [\"hid\", \"api\", \"usb\", \"binding\", \"wrapper\"]\nbuild = \"build.rs\"\nlinks = \"hidapi\"\ndocumentation = \"https://docs.rs/hidapi\"\nedition = \"2021\"\ninclude = [\n    \"README.md\",\n    \"LICENSE.txt\",\n    \"build.rs\",\n    \"/src\",\n    \"/etc/hidapi/CMakeLists.txt\",\n    \"/etc/hidapi/LICENSE*\",\n    \"/etc/hidapi/VERSION\",\n    \"/etc/hidapi/hidapi\",\n    \"/etc/hidapi/libusb\",\n    \"/etc/hidapi/src\",\n    \"/etc/hidapi/udev\",\n    # Platform support files\n    \"/etc/hidapi/linux/CMakeLists.txt\",\n    \"/etc/hidapi/linux/*.c\",\n    \"/etc/hidapi/linux/*.h\",\n    \"/etc/hidapi/mac/CMakeLists.txt\",\n    \"/etc/hidapi/mac/*.c\",\n    \"/etc/hidapi/mac/*.h\",\n    \"/etc/hidapi/windows/CMakeLists.txt\",\n    \"/etc/hidapi/windows/*.c\",\n    \"/etc/hidapi/windows/*.h\",\n]\n\n[features]\ndefault = [\"linux-static-hidraw\", \"illumos-static-libusb\"]\nlinux-static-libusb = []\nlinux-static-hidraw = []\nlinux-shared-libusb = []\nlinux-shared-hidraw = []\nlinux-native = [\"dep:udev\", \"dep:nix\"]\nlinux-native-basic-udev = [\"dep:basic-udev\", \"dep:nix\"]\nillumos-static-libusb = []\nillumos-shared-libusb = []\nmacos-shared-device = []\nwindows-native = [\n    \"windows-sys/Win32_Devices_DeviceAndDriverInstallation\",\n    \"windows-sys/Win32_Devices_HumanInterfaceDevice\",\n    \"windows-sys/Win32_Devices_Properties\",\n    \"windows-sys/Win32_Security\",\n    \"windows-sys/Win32_Storage_FileSystem\",\n    \"windows-sys/Win32_System_IO\",\n    \"windows-sys/Win32_System_Threading\",\n    \"windows-sys/Win32_UI_Shell_PropertiesSystem\"\n]\n\n[dependencies]\nlibc = \"0.2\"\ncfg-if = \"1\"\n\n[target.'cfg(target_os = \"linux\")'.dependencies]\nudev = { version = \"0.9\", optional = true }\nbasic-udev = { version = \"0.1\", optional = true }\nnix = { version = \"0.30\", optional = true, features = [\"fs\", \"ioctl\", \"poll\"] }\n\n[target.'cfg(windows)'.dependencies]\nwindows-sys = { version = \"0.61\", features = [\"Win32_Foundation\"] }\n\n[build-dependencies]\ncc = \"1.2\"\npkg-config = \"0.3\"\n\n[package.metadata.docs.rs]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n"
  },
  {
    "path": "LICENSE.txt",
    "content": "Copyright 2017 The hidapi-rs Developers\n\nPermission is hereby granted, free of charge, to any person obtaining a copy of this software and\nassociated documentation files (the \"Software\"), to deal in the Software without restriction,\nincluding without limitation the rights to use, copy, modify, merge, publish, distribute,\nsublicense, and/or sell copies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all copies or substantial\nportions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT\nNOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES\nOR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\nCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# hidapi [![Version](https://img.shields.io/crates/v/hidapi.svg)](https://crates.io/crates/hidapi) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://github.com/Osspial/hidapi-rs/blob/master/LICENSE.txt) [![Documentation](https://docs.rs/hidapi/badge.svg)](https://docs.rs/hidapi) [![Chat](https://img.shields.io/badge/discord-devroom-blue.svg)](https://discordapp.com/invite/3ahhJGN)\n\nThis crate provides a rust abstraction over the features of the C library\n[hidapi](https://github.com/libusb/hidapi). Based off of\n[hidapi-rs](https://github.com/Osspial/hidapi-rs) by Osspial.\n\n# Usage\n\nThis crate is on [crates.io](https://crates.io/crates/hidapi) and can be\nused by adding `hidapi` to the dependencies in your project's `Cargo.toml`.\n\nIn case you are downloading / checking out this repository directly via git,\nmake sure to initialize the git submodules after cloning!\n\n```sh\ngit submodule update --init\n```\n\n# Example\n\n```rust\nextern crate hidapi;\n\nlet api = hidapi::HidApi::new().unwrap();\n// Print out information about all connected devices\nfor device in api.device_list() {\n    println!(\"{:#?}\", device);\n}\n\n// Connect to device using its VID and PID\nlet (VID, PID) = (0x0123, 0x3456);\nlet device = api.open(VID, PID).unwrap();\n\n// Read data from device\nlet mut buf = [0u8; 8];\nlet res = device.read(&mut buf[..]).unwrap();\nprintln!(\"Read: {:?}\", &buf[..res]);\n\n// Write data to device\nlet buf = [0u8, 1, 2, 3, 4];\nlet res = device.write(&buf).unwrap();\nprintln!(\"Wrote: {:?} byte(s)\", res);\n```\n\n# Documentation\nAvailable at [docs.rs](https://docs.rs/hidapi).\n"
  },
  {
    "path": "build.rs",
    "content": "// **************************************************************************\n// Copyright (c) 2015 Roland Ruckerbauer All Rights Reserved.\n//\n// This file is part of hidapi_rust.\n//\n// hidapi_rust is free software: you can redistribute it and/or modify\n// it under the terms of the GNU General Public License as published by\n// the Free Software Foundation, either version 3 of the License, or\n// (at your option) any later version.\n//\n// hidapi_rust is distributed in the hope that it will be useful,\n// but WITHOUT ANY WARRANTY; without even the implied warranty of\n// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n// GNU General Public License for more details.\n//\n// You should have received a copy of the GNU General Public License\n// along with hidapi_rust.  If not, see <http://www.gnu.org/licenses/>.\n// *************************************************************************\n\nextern crate cc;\nextern crate pkg_config;\n\nuse std::env;\n\nfn main() {\n    let target = env::var(\"TARGET\").unwrap();\n\n    println!(\"cargo:rustc-check-cfg=cfg(hidapi)\");\n    println!(\"cargo:rustc-check-cfg=cfg(libusb)\");\n\n    if target.contains(\"linux\") {\n        compile_linux();\n    } else if target.contains(\"windows\") {\n        compile_windows();\n    } else if target.contains(\"darwin\") {\n        compile_macos();\n    } else if target.contains(\"freebsd\") {\n        compile_freebsd();\n    } else if target.contains(\"openbsd\") {\n        compile_openbsd();\n    } else if target.contains(\"illumos\") {\n        compile_illumos();\n    } else {\n        panic!(\"Unsupported target os for hidapi-rs\");\n    }\n}\n\nfn compile_linux() {\n    // First check the features enabled for the crate.\n    // Only one linux backend should be enabled at a time.\n\n    let avail_backends: [(&'static str, &dyn Fn()); 6] = [\n        (\"LINUX_STATIC_HIDRAW\", &|| {\n            let mut config = cc::Build::new();\n            println!(\"cargo:rerun-if-changed=etc/hidapi/linux/hid.c\");\n            config\n                .file(\"etc/hidapi/linux/hid.c\")\n                .include(\"etc/hidapi/hidapi\");\n            pkg_config::probe_library(\"libudev\").expect(\"Unable to find libudev\");\n            config.compile(\"libhidapi.a\");\n            println!(\"cargo:rustc-cfg=hidapi\");\n        }),\n        (\"LINUX_STATIC_LIBUSB\", &|| {\n            let mut config = cc::Build::new();\n            println!(\"cargo:rerun-if-changed=etc/hidapi/linux/hid.c\");\n            config\n                .file(\"etc/hidapi/libusb/hid.c\")\n                .include(\"etc/hidapi/hidapi\");\n            let lib = pkg_config::find_library(\"libusb-1.0\").expect(\"Unable to find libusb-1.0\");\n            for path in lib.include_paths {\n                config.include(\n                    path.to_str()\n                        .expect(\"Failed to convert include path to str\"),\n                );\n            }\n            config.compile(\"libhidapi.a\");\n            println!(\"cargo:rustc-cfg=libusb\");\n            println!(\"cargo:rustc-cfg=hidapi\");\n        }),\n        (\"LINUX_SHARED_HIDRAW\", &|| {\n            pkg_config::probe_library(\"hidapi-hidraw\").expect(\"Unable to find hidapi-hidraw\");\n            println!(\"cargo:rustc-cfg=hidapi\");\n        }),\n        (\"LINUX_SHARED_LIBUSB\", &|| {\n            pkg_config::probe_library(\"libusb-1.0\").expect(\"Unable to find libusb-1.0\");\n            pkg_config::probe_library(\"hidapi-libusb\").expect(\"Unable to find hidapi-libusb\");\n            println!(\"cargo:rustc-cfg=libusb\");\n            println!(\"cargo:rustc-cfg=hidapi\");\n        }),\n        (\"LINUX_NATIVE\", &|| {\n            // The udev crate takes care of finding its library\n        }),\n        (\"LINUX_NATIVE_BASIC_UDEV\", &|| {\n            // Enable `feature=\"linux-native\"` to reuse the existing\n            // linux-native code. It is considered an error in\n            // basic-udev if this fails to compile.\n            println!(\"cargo:rustc-cfg=feature=\\\"linux-native\\\"\");\n        }),\n    ];\n\n    let mut backends = avail_backends\n        .iter()\n        .filter(|f| env::var(format!(\"CARGO_FEATURE_{}\", f.0)).is_ok());\n\n    if backends.clone().count() != 1 {\n        panic!(\"Exactly one linux hidapi backend must be selected.\");\n    }\n\n    // Build it!\n    (backends.next().unwrap().1)();\n}\n\n//#[cfg(all(feature = \"shared-libusb\", not(feature = \"shared-hidraw\")))]\n//fn compile_linux() {\n//\n//}\n//\n//#[cfg(all(feature = \"shared-hidraw\"))]\n//fn compile_linux() {\n//\n//}\n\nfn compile_freebsd() {\n    pkg_config::probe_library(\"hidapi\").expect(\"Unable to find hidapi\");\n    println!(\"cargo:rustc-cfg=libusb\");\n    println!(\"cargo:rustc-cfg=hidapi\");\n}\n\nfn compile_openbsd() {\n    pkg_config::probe_library(\"hidapi-libusb\").expect(\"Unable to find hidapi\");\n    println!(\"cargo:rustc-cfg=libusb\");\n    println!(\"cargo:rustc-cfg=hidapi\");\n}\n\nfn compile_illumos() {\n    // First check the features enabled for the crate.\n    // Only one illumos backend should be enabled at a time.\n\n    let avail_backends: [(&'static str, &dyn Fn()); 2] = [\n        (\"ILLUMOS_STATIC_LIBUSB\", &|| {\n            let mut config = cc::Build::new();\n            config\n                .file(\"etc/hidapi/libusb/hid.c\")\n                .include(\"etc/hidapi/hidapi\");\n            let lib = pkg_config::find_library(\"libusb-1.0\").expect(\"Unable to find libusb-1.0\");\n            for path in lib.include_paths {\n                config.include(\n                    path.to_str()\n                        .expect(\"Failed to convert include path to str\"),\n                );\n            }\n            config.compile(\"libhidapi.a\");\n        }),\n        (\"ILLUMOS_SHARED_LIBUSB\", &|| {\n            pkg_config::probe_library(\"hidapi-libusb\").expect(\"Unable to find hidapi-libusb\");\n        }),\n    ];\n\n    let mut backends = avail_backends\n        .iter()\n        .filter(|f| env::var(format!(\"CARGO_FEATURE_{}\", f.0)).is_ok());\n\n    if backends.clone().count() != 1 {\n        panic!(\"Exactly one illumos hidapi backend must be selected.\");\n    }\n\n    // Build it!\n    (backends.next().unwrap().1)();\n\n    println!(\"cargo:rustc-cfg=libusb\");\n    println!(\"cargo:rustc-cfg=hidapi\");\n}\n\nfn compile_windows() {\n    #[cfg(not(feature = \"windows-native\"))]\n    {\n        let linkage = env::var(\"CARGO_CFG_TARGET_FEATURE\").unwrap_or_default();\n\n        let mut cc = cc::Build::new();\n        cc.file(\"etc/hidapi/windows/hid.c\")\n            .include(\"etc/hidapi/hidapi\");\n\n        if linkage.contains(\"crt-static\") {\n            // https://doc.rust-lang.org/reference/linkage.html#static-and-dynamic-c-runtimes\n            cc.static_crt(true);\n        }\n        cc.compile(\"libhidapi.a\");\n        println!(\"cargo:rustc-link-lib=setupapi\");\n\n        println!(\"cargo:rustc-cfg=hidapi\");\n    }\n}\n\nfn compile_macos() {\n    cc::Build::new()\n        .file(\"etc/hidapi/mac/hid.c\")\n        .include(\"etc/hidapi/hidapi\")\n        .compile(\"libhidapi.a\");\n    println!(\"cargo:rustc-cfg=hidapi\");\n    println!(\"cargo:rustc-link-lib=framework=IOKit\");\n    println!(\"cargo:rustc-link-lib=framework=CoreFoundation\");\n    println!(\"cargo:rustc-link-lib=framework=AppKit\")\n}\n"
  },
  {
    "path": "examples/co2mon.rs",
    "content": "/****************************************************************************\n    Copyright (c) 2015 Artyom Pavlov All Rights Reserved.\n\n    This file is part of hidapi-rs, based on hidapi_rust by Roland Ruckerbauer.\n    It's also based on the Oleg Bulatov's work (https://github.com/dmage/co2mon)\n****************************************************************************/\n\n//! Opens a KIT MT 8057 CO2 detector and reads data from it. This\n//! example will not work unless such device is plugged into your system.\n\nuse hidapi::{HidApi, HidError};\nuse std::io;\n\nconst CODE_TEMPERATURE: u8 = 0x42;\nconst CODE_CONCENTRATION: u8 = 0x50;\nconst HID_TIMEOUT: i32 = 5000;\nconst DEV_VID: u16 = 0x04d9;\nconst DEV_PID: u16 = 0xa052;\nconst PACKET_SIZE: usize = 8;\n\ntype Packet = [u8; PACKET_SIZE];\n\nenum CO2Result {\n    Temperature(f32),\n    Concentration(u16),\n    Unknown(u8, u16),\n    Error(&'static str),\n}\n\nfn decode_temperature(value: u16) -> f32 {\n    (value as f32) * 0.0625 - 273.15\n}\n\nfn decrypt(buf: Packet) -> Packet {\n    let mut res: [u8; PACKET_SIZE] = [\n        (buf[3] << 5) | (buf[2] >> 3),\n        (buf[2] << 5) | (buf[4] >> 3),\n        (buf[4] << 5) | (buf[0] >> 3),\n        (buf[0] << 5) | (buf[7] >> 3),\n        (buf[7] << 5) | (buf[1] >> 3),\n        (buf[1] << 5) | (buf[6] >> 3),\n        (buf[6] << 5) | (buf[5] >> 3),\n        (buf[5] << 5) | (buf[3] >> 3),\n    ];\n\n    let magic_word = b\"Htemp99e\";\n    for i in 0..PACKET_SIZE {\n        let sub_val: u8 = magic_word[i].rotate_right(4);\n        res[i] = u8::wrapping_sub(res[i], sub_val);\n    }\n\n    res\n}\n\nfn decode_buf(buf: Packet) -> CO2Result {\n    // Do we need to decrypt the data?\n    let res = if buf[4] == 0x0d { buf } else { decrypt(buf) };\n\n    let kind = res[0];\n    let val = u16::from_be_bytes(res[1..3].try_into().unwrap());\n    let checksum = res[3];\n    let tail = res[4];\n\n    if tail != 0x0d {\n        return CO2Result::Error(\"Unexpected data (data[4] != 0x0d)\");\n    }\n    let checksum_calc = res[0].wrapping_add(res[1]).wrapping_add(res[2]);\n    if checksum != checksum_calc {\n        return CO2Result::Error(\"Checksum error\");\n    }\n\n    match kind {\n        CODE_TEMPERATURE => CO2Result::Temperature(decode_temperature(val)),\n        CODE_CONCENTRATION => {\n            if val > 3000 {\n                CO2Result::Error(\"Concentration bigger than 3000 (uninitialized device?)\")\n            } else {\n                CO2Result::Concentration(val)\n            }\n        }\n        _ => CO2Result::Unknown(kind, val),\n    }\n}\n\nfn invalid_data_err(msg: impl Into<String>) -> HidError {\n    HidError::IoError {\n        error: io::Error::new(io::ErrorKind::InvalidData, msg.into()),\n    }\n}\n\nfn main() -> Result<(), HidError> {\n    let api = HidApi::new()?;\n    let dev = api.open(DEV_VID, DEV_PID)?;\n    dev.send_feature_report(&[0; PACKET_SIZE])?;\n\n    if let Some(manufacturer) = dev.get_manufacturer_string()? {\n        println!(\"Manufacurer:\\t{manufacturer}\");\n    }\n    if let Some(product) = dev.get_product_string()? {\n        println!(\"Product:\\t{product}\");\n    }\n    if let Some(serial_number) = dev.get_serial_number_string()? {\n        println!(\"Serial number:\\t{serial_number}\");\n    }\n\n    let mut buf = [0; PACKET_SIZE];\n    loop {\n        let n = dev.read_timeout(&mut buf[..], HID_TIMEOUT)?;\n        if n != PACKET_SIZE {\n            let msg = format!(\"unexpected packet length: {n}/{PACKET_SIZE}\");\n            return Err(invalid_data_err(msg));\n        }\n        match decode_buf(buf) {\n            CO2Result::Temperature(val) => println!(\"Temp:\\t{val}\"),\n            CO2Result::Concentration(val) => println!(\"Conc:\\t{val}\"),\n            CO2Result::Unknown(kind, val) => eprintln!(\"Unknown({kind}):\\t{val}\"),\n            CO2Result::Error(msg) => {\n                return Err(invalid_data_err(msg));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "examples/dump_descriptors.rs",
    "content": "use hidapi::HidApi;\n\nfn main() {\n    println!(\"Printing all available hid devices:\");\n\n    match HidApi::new() {\n        Ok(api) => {\n            for device in api.device_list() {\n                println!(\n                    \"  {} (Interface {}):\",\n                    device.product_string().unwrap_or(\"<COULD NOT FETCH>\"),\n                    device.interface_number()\n                );\n                let mut descriptor = vec![0u8; 2048];\n                match device\n                    .open_device(&api)\n                    .and_then(|dev| dev.get_report_descriptor(&mut descriptor))\n                {\n                    Ok(length) => println!(\"    {:?}\", &mut descriptor[..length]),\n                    Err(err) => println!(\"    Failed to retrieve descriptor ({:?})\", err),\n                }\n            }\n        }\n        Err(e) => {\n            eprintln!(\"Error: {}\", e);\n        }\n    }\n}\n"
  },
  {
    "path": "examples/logitech_gprox.rs",
    "content": "/****************************************************************************\n    Copyright (c) 2022 ruabmbua All Rights Reserved.\n****************************************************************************/\n\n//! Sets the sidechannel volume of the logitech gpro x headset\n\nextern crate hidapi;\n\nuse hidapi::HidApi;\nuse std::error::Error;\n\nfn main() -> Result<(), Box<dyn Error>> {\n    let vol = std::env::args()\n        .nth(1)\n        .map(|arg| arg.parse::<u8>())\n        .ok_or(\"missing sidechannel volume arg\")??\n        .min(100);\n\n    let api = HidApi::new()?;\n    let dev = api.open(0x046d, 0x0aaa)?;\n\n    println!(\"Setting sidechannel volume to {}\", vol);\n\n    dev.write(&[0x11, 0xff, 0x05, 0x1c, vol])?;\n\n    Ok(())\n}\n"
  },
  {
    "path": "examples/lshid.rs",
    "content": "/****************************************************************************\n    Copyright (c) 2015 Osspial All Rights Reserved.\n\n    This file is part of hidapi-rs, based on hidapi_rust by Roland Ruckerbauer.\n****************************************************************************/\n\n//! Prints out a list of HID devices\n\nextern crate hidapi;\n\nuse hidapi::HidApi;\n\nfn main() {\n    println!(\"Printing all available hid devices:\");\n\n    match HidApi::new() {\n        Ok(api) => {\n            for device in api.device_list() {\n                println!(\n                    \"VID: {:04x}, PID: {:04x}, Serial: {}, Product name: {}, Interface: {}\",\n                    device.vendor_id(),\n                    device.product_id(),\n                    device.serial_number().unwrap_or(\"<COULD NOT FETCH>\"),\n                    device.product_string().unwrap_or(\"<COULD NOT FETCH>\"),\n                    device.interface_number()\n                );\n            }\n        }\n        Err(e) => {\n            eprintln!(\"Error: {}\", e);\n        }\n    }\n}\n"
  },
  {
    "path": "examples/open_first_device.rs",
    "content": "/****************************************************************************\n    Copyright (c) 2018 Roland Ruckerbauer All Rights Reserved.\n\n    This file is part of hidapi-rs, based on hidapi-rs by Osspial\n****************************************************************************/\n\n//! Opens the first hid device it can find, and reads data in a blocking fashion\n//! from it in an endless loop.\n\nextern crate hidapi;\n\nuse hidapi::{HidApi, HidError};\n\nfn main() {\n    fn run() -> Result<(), HidError> {\n        let hidapi = HidApi::new()?;\n\n        let device_info = hidapi\n            .device_list()\n            .next()\n            .expect(\"No devices are available!\")\n            .clone();\n\n        println!(\n            \"Opening device:\\n VID: {:04x}, PID: {:04x}\\n\",\n            device_info.vendor_id(),\n            device_info.product_id()\n        );\n\n        let device = device_info.open_device(&hidapi)?;\n\n        let mut buf = vec![0; 64];\n\n        println!(\"Reading data from device ...\\n\");\n\n        loop {\n            let len = device.read(&mut buf)?;\n            println!(\"{:?}\", &buf[..len]);\n        }\n    }\n\n    if let Err(e) = run() {\n        eprintln!(\"Error: {}\", e);\n    }\n}\n"
  },
  {
    "path": "examples/readhid.rs",
    "content": "/****************************************************************************\n    Copyright (c) 2015 Osspial All Rights Reserved.\n\n    This file is part of hidapi-rs, based on hidapi_rust by Roland Ruckerbauer.\n****************************************************************************/\n\n//! Opens a Thrustmaster T-Flight HOTAS X HID and reads data from it. This\n//! example will not work unless such an HID is plugged in to your system.\n//! Will update in the future to support all HIDs.\n\nextern crate hidapi;\n\nuse hidapi::HidApi;\n\nfn main() {\n    let api = HidApi::new().expect(\"Failed to create API instance\");\n\n    let joystick = api.open(1103, 45320).expect(\"Failed to open device\");\n\n    loop {\n        let mut buf = [0u8; 256];\n        let res = joystick.read(&mut buf[..]).unwrap();\n\n        let mut data_string = String::new();\n\n        for u in &buf[..res] {\n            data_string.push_str(&(u.to_string() + \"\\t\"));\n        }\n\n        println!(\"{}\", data_string);\n    }\n}\n"
  },
  {
    "path": "examples/static_lifetime_bound.rs",
    "content": "/****************************************************************************\nCopyright (c) 2015 Osspial All Rights Reserved.\n\nThis file is part of hidapi-rs, based on hidapi_rust by Roland Ruckerbauer.\n****************************************************************************/\n\n//! This example shows the added possibility (after version 0.4.1),\n//! to move devices into a function / or closure with static lifetime bounds.\n\nextern crate hidapi;\n\nuse hidapi::{HidApi, HidDevice};\nuse std::rc::Rc;\n\nfn main() {\n    let _dev = test_lt();\n}\n\nfn requires_static_lt_bound<F: Fn() + 'static>(f: F) {\n    f();\n}\n\nfn test_lt() -> Rc<HidDevice> {\n    let api = HidApi::new().expect(\"Hidapi init failed\");\n\n    let mut devices = api.device_list();\n\n    let dev_info = devices\n        .next()\n        .expect(\"There is not a single hid device available\");\n\n    let dev = Rc::new(\n        api.open(dev_info.vendor_id(), dev_info.product_id())\n            .expect(\"Can not open device\"),\n    );\n\n    let dev_1 = dev.clone();\n    requires_static_lt_bound(move || {\n        println!(\"{:?}\", dev_1.get_device_info().unwrap()); //<! Can be captured by closure with static lt\n    });\n\n    dev //<! Can be returned from a function, which exceeds the lifetime of the API context\n}\n"
  },
  {
    "path": "src/error.rs",
    "content": "// **************************************************************************\n// Copyright (c) 2018 Roland Ruckerbauer All Rights Reserved.\n//\n// This file is part of hidapi-rs, based on hidapi-rs by Osspial\n// **************************************************************************\n\nuse libc::wchar_t;\nuse std::error::Error;\nuse std::fmt::{Display, Formatter, Result};\n\nuse crate::DeviceInfo;\n\n#[derive(Debug)]\npub enum HidError {\n    HidApiError {\n        message: String,\n    },\n    HidApiErrorEmpty,\n    FromWideCharError {\n        wide_char: wchar_t,\n    },\n    InitializationError,\n    InvalidZeroSizeData,\n    IncompleteSendError {\n        sent: usize,\n        all: usize,\n    },\n    SetBlockingModeError {\n        mode: &'static str,\n    },\n    OpenHidDeviceWithDeviceInfoError {\n        device_info: Box<DeviceInfo>,\n    },\n    /// An IO error or a system error that can be represented as such\n    IoError {\n        error: std::io::Error,\n    },\n}\n\nimpl Display for HidError {\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result {\n        match self {\n            HidError::HidApiError { message } => write!(f, \"hidapi error: {}\", message),\n            HidError::HidApiErrorEmpty => write!(f, \"hidapi error: (could not get error message)\"),\n            HidError::FromWideCharError { wide_char } => {\n                write!(f, \"failed converting {:#X} to rust char\", wide_char)\n            }\n            HidError::InitializationError => {\n                write!(f, \"Failed to initialize hidapi\")\n            }\n            HidError::InvalidZeroSizeData => write!(f, \"Invalid data: size can not be 0\"),\n            HidError::IncompleteSendError { sent, all } => write!(\n                f,\n                \"Failed to send all data: only sent {} out of {} bytes\",\n                sent, all\n            ),\n            HidError::SetBlockingModeError { mode } => {\n                write!(f, \"Can not set blocking mode to '{}'\", mode)\n            }\n            HidError::OpenHidDeviceWithDeviceInfoError { device_info } => {\n                write!(f, \"Can not open hid device with: {:?}\", *device_info)\n            }\n            HidError::IoError { error } => {\n                write!(f, \"{error}\")\n            }\n        }\n    }\n}\n\nimpl Error for HidError {}\n\nimpl From<std::io::Error> for HidError {\n    fn from(e: std::io::Error) -> Self {\n        Self::IoError { error: e }\n    }\n}\n\n#[cfg(all(feature = \"linux-native\", target_os = \"linux\"))]\nimpl From<nix::errno::Errno> for HidError {\n    fn from(e: nix::errno::Errno) -> Self {\n        Self::IoError { error: e.into() }\n    }\n}\n"
  },
  {
    "path": "src/ffi.rs",
    "content": "#![allow(unused_imports, dead_code)]\n\n/// **************************************************************************\n/// Copyright (c) 2015 Osspial All Rights Reserved.\n///\n/// This file is part of hidapi-rs, based on hidapi_rust by Roland Ruckerbauer.\n/// *************************************************************************\n// For documentation look at the corresponding C header file hidapi.h\nuse libc::{c_char, c_int, c_uchar, c_ushort, c_void, intptr_t, size_t, wchar_t};\ntype HidBusType = crate::BusType;\npub type HidDevice = c_void;\ntype LibusbContext = c_void;\n\n#[repr(C)]\npub struct HidDeviceInfo {\n    pub path: *mut c_char,\n    pub vendor_id: c_ushort,\n    pub product_id: c_ushort,\n    pub serial_number: *mut wchar_t,\n    pub release_number: c_ushort,\n    pub manufacturer_string: *mut wchar_t,\n    pub product_string: *mut wchar_t,\n    pub usage_page: c_ushort,\n    pub usage: c_ushort,\n    pub interface_number: c_int,\n    pub next: *mut HidDeviceInfo,\n    pub bus_type: HidBusType,\n}\n\n#[allow(dead_code)]\nextern \"C\" {\n    #[cfg_attr(target_os = \"openbsd\", link_name = \"hidapi_hid_init\")]\n    pub fn hid_init() -> c_int;\n    pub fn hid_exit() -> c_int;\n    pub fn hid_enumerate(vendor_id: c_ushort, product_id: c_ushort) -> *mut HidDeviceInfo;\n    pub fn hid_free_enumeration(hid_device_info: *mut HidDeviceInfo);\n    pub fn hid_open(\n        vendor_id: c_ushort,\n        product_id: c_ushort,\n        serial_number: *const wchar_t,\n    ) -> *mut HidDevice;\n    pub fn hid_open_path(path: *const c_char) -> *mut HidDevice;\n    #[cfg(libusb)]\n    pub fn hid_libusb_wrap_sys_device(sys_dev: intptr_t, interface_num: c_int) -> *mut HidDevice;\n    #[cfg(all(libusb, not(target_os = \"freebsd\")))]\n    pub fn libusb_set_option(ctx: *mut LibusbContext, option: c_int);\n    pub fn hid_write(device: *mut HidDevice, data: *const c_uchar, length: size_t) -> c_int;\n    pub fn hid_read_timeout(\n        device: *mut HidDevice,\n        data: *mut c_uchar,\n        length: size_t,\n        milleseconds: c_int,\n    ) -> c_int;\n    pub fn hid_read(device: *mut HidDevice, data: *mut c_uchar, length: size_t) -> c_int;\n    pub fn hid_set_nonblocking(device: *mut HidDevice, nonblock: c_int) -> c_int;\n    pub fn hid_send_feature_report(\n        device: *mut HidDevice,\n        data: *const c_uchar,\n        length: size_t,\n    ) -> c_int;\n    pub fn hid_get_feature_report(\n        device: *mut HidDevice,\n        data: *mut c_uchar,\n        length: size_t,\n    ) -> c_int;\n    pub fn hid_send_output_report(\n        device: *mut HidDevice,\n        data: *const c_uchar,\n        length: size_t,\n    ) -> c_int;\n    pub fn hid_get_input_report(\n        device: *mut HidDevice,\n        data: *mut c_uchar,\n        length: size_t,\n    ) -> c_int;\n    pub fn hid_close(device: *mut HidDevice);\n    pub fn hid_get_manufacturer_string(\n        device: *mut HidDevice,\n        string: *mut wchar_t,\n        maxlen: size_t,\n    ) -> c_int;\n    pub fn hid_get_product_string(\n        device: *mut HidDevice,\n        string: *mut wchar_t,\n        maxlen: size_t,\n    ) -> c_int;\n    pub fn hid_get_serial_number_string(\n        device: *mut HidDevice,\n        string: *mut wchar_t,\n        maxlen: size_t,\n    ) -> c_int;\n    pub fn hid_get_device_info(device: *mut HidDevice) -> *mut HidDeviceInfo;\n    pub fn hid_get_indexed_string(\n        device: *mut HidDevice,\n        string_index: c_int,\n        string: *mut wchar_t,\n        maxlen: size_t,\n    ) -> c_int;\n    pub fn hid_get_report_descriptor(\n        hid_device: *mut HidDevice,\n        buf: *mut c_uchar,\n        buf_size: size_t,\n    ) -> c_int;\n    pub fn hid_error(device: *mut HidDevice) -> *const wchar_t;\n}\n\n// For documentation look at the corresponding C header file hidapi_darwin.h\n#[cfg(target_os = \"macos\")]\npub mod macos {\n    use super::*;\n\n    extern \"C\" {\n        pub fn hid_darwin_get_location_id(device: *mut HidDevice, location_id: *mut u32) -> c_int;\n        pub fn hid_darwin_set_open_exclusive(open_exclusive: c_int);\n        pub fn hid_darwin_get_open_exclusive() -> c_int;\n        pub fn hid_darwin_is_device_open_exclusive(device: *mut HidDevice) -> c_int;\n    }\n}\n\n// For documentation look at the corresponding C header file hidapi_winapi.h\n#[cfg(target_os = \"windows\")]\npub mod windows {\n    use super::*;\n    use windows_sys::core::GUID;\n\n    extern \"C\" {\n        pub fn hid_winapi_get_container_id(\n            device: *mut HidDevice,\n            container_id: *mut GUID,\n        ) -> c_int;\n\n    }\n}\n"
  },
  {
    "path": "src/hidapi/macos.rs",
    "content": "//! The extra beahviour for macOS\n\nuse super::HidDevice;\nuse crate::{ffi, HidDeviceBackendBase, HidDeviceBackendMacos, HidResult};\n\nimpl HidDeviceBackendMacos for HidDevice {\n    fn get_location_id(&self) -> HidResult<u32> {\n        let mut location_id: u32 = 0;\n\n        let res = unsafe {\n            ffi::macos::hid_darwin_get_location_id(self._hid_device, &mut location_id as *mut u32)\n        };\n\n        if res == -1 {\n            match self.check_error() {\n                Ok(err) => Err(err),\n                Err(err) => Err(err),\n            }\n        } else {\n            Ok(location_id)\n        }\n    }\n\n    fn is_open_exclusive(&self) -> HidResult<bool> {\n        let res = unsafe { ffi::macos::hid_darwin_is_device_open_exclusive(self._hid_device) };\n\n        if res == -1 {\n            match self.check_error() {\n                Ok(err) => Err(err),\n                Err(err) => Err(err),\n            }\n        } else {\n            Ok(res == 1)\n        }\n    }\n}\n"
  },
  {
    "path": "src/hidapi/windows.rs",
    "content": "//! The extra behaviour for Windows\n\nuse std::ptr::addr_of_mut;\nuse windows_sys::core::GUID;\n\nuse super::HidDevice;\nuse crate::{ffi, HidDeviceBackendBase, HidDeviceBackendWindows, HidResult};\n\nimpl HidDeviceBackendWindows for HidDevice {\n    fn get_container_id(&self) -> HidResult<GUID> {\n        let mut container_id: GUID = unsafe { std::mem::zeroed() };\n\n        let res = unsafe {\n            ffi::windows::hid_winapi_get_container_id(self._hid_device, addr_of_mut!(container_id))\n        };\n\n        if res == -1 {\n            match self.check_error() {\n                Ok(err) => Err(err),\n                Err(err) => Err(err),\n            }\n        } else {\n            Ok(container_id)\n        }\n    }\n}\n"
  },
  {
    "path": "src/hidapi.rs",
    "content": "//! The implementation which uses the C library to perform operations\n\nuse std::{\n    ffi::CStr,\n    fmt::{self, Debug},\n};\n\nuse libc::{c_int, size_t, wchar_t};\n\nuse crate::{ffi, DeviceInfo, HidDeviceBackendBase, HidError, HidResult, WcharString};\n\n#[cfg(target_os = \"macos\")]\nmod macos;\n#[cfg(target_os = \"windows\")]\nmod windows;\n\nconst STRING_BUF_LEN: usize = 128;\n\npub struct HidApiBackend;\n\nimpl HidApiBackend {\n    pub fn get_hid_device_info_vector(vid: u16, pid: u16) -> HidResult<Vec<DeviceInfo>> {\n        let mut device_vector = Vec::with_capacity(8);\n\n        let enumeration = unsafe { ffi::hid_enumerate(vid, pid) };\n        {\n            let mut current_device = enumeration;\n\n            while !current_device.is_null() {\n                device_vector.push(unsafe { conv_hid_device_info(current_device)? });\n                current_device = unsafe { (*current_device).next };\n            }\n        }\n\n        if !enumeration.is_null() {\n            unsafe { ffi::hid_free_enumeration(enumeration) };\n        }\n\n        Ok(device_vector)\n    }\n\n    pub fn open(vid: u16, pid: u16) -> HidResult<HidDevice> {\n        let device = unsafe { ffi::hid_open(vid, pid, std::ptr::null()) };\n\n        if device.is_null() {\n            match Self::check_error() {\n                Ok(err) => Err(err),\n                Err(e) => Err(e),\n            }\n        } else {\n            Ok(HidDevice::from_raw(device))\n        }\n    }\n\n    pub fn open_serial(vid: u16, pid: u16, sn: &str) -> HidResult<HidDevice> {\n        let mut chars = sn.chars().map(|c| c as wchar_t).collect::<Vec<_>>();\n        chars.push(0 as wchar_t);\n        let device = unsafe { ffi::hid_open(vid, pid, chars.as_ptr()) };\n        if device.is_null() {\n            match Self::check_error() {\n                Ok(err) => Err(err),\n                Err(e) => Err(e),\n            }\n        } else {\n            Ok(HidDevice::from_raw(device))\n        }\n    }\n\n    pub fn open_path(device_path: &CStr) -> HidResult<HidDevice> {\n        let device = unsafe { ffi::hid_open_path(device_path.as_ptr()) };\n\n        if device.is_null() {\n            match Self::check_error() {\n                Ok(err) => Err(err),\n                Err(e) => Err(e),\n            }\n        } else {\n            Ok(HidDevice::from_raw(device))\n        }\n    }\n\n    pub fn check_error() -> HidResult<HidError> {\n        Ok(HidError::HidApiError {\n            message: unsafe {\n                match wchar_to_string(ffi::hid_error(std::ptr::null_mut())) {\n                    WcharString::String(s) => s,\n                    _ => return Err(HidError::HidApiErrorEmpty),\n                }\n            },\n        })\n    }\n}\n\n/// Converts a pointer to a `*const wchar_t` to a WcharString.\nunsafe fn wchar_to_string(wstr: *const wchar_t) -> WcharString {\n    if wstr.is_null() {\n        return WcharString::None;\n    }\n\n    let mut char_vector: Vec<char> = Vec::with_capacity(8);\n    let mut raw_vector: Vec<wchar_t> = Vec::with_capacity(8);\n    let mut index: isize = 0;\n    let mut invalid_char = false;\n\n    let o = |i| *wstr.offset(i);\n\n    while o(index) != 0 {\n        use std::char;\n\n        raw_vector.push(*wstr.offset(index));\n\n        if !invalid_char {\n            if let Some(c) = char::from_u32(o(index) as u32) {\n                char_vector.push(c);\n            } else {\n                invalid_char = true;\n            }\n        }\n\n        index += 1;\n    }\n\n    if !invalid_char {\n        WcharString::String(char_vector.into_iter().collect())\n    } else {\n        WcharString::Raw(raw_vector)\n    }\n}\n\n/// Convert the CFFI `HidDeviceInfo` struct to a native `HidDeviceInfo` struct\npub unsafe fn conv_hid_device_info(src: *mut ffi::HidDeviceInfo) -> HidResult<DeviceInfo> {\n    Ok(DeviceInfo {\n        path: CStr::from_ptr((*src).path).to_owned(),\n        vendor_id: (*src).vendor_id,\n        product_id: (*src).product_id,\n        serial_number: wchar_to_string((*src).serial_number),\n        release_number: (*src).release_number,\n        manufacturer_string: wchar_to_string((*src).manufacturer_string),\n        product_string: wchar_to_string((*src).product_string),\n        usage_page: (*src).usage_page,\n        usage: (*src).usage,\n        interface_number: (*src).interface_number,\n        bus_type: (*src).bus_type,\n    })\n}\n\n/// Object for accessing HID device\npub struct HidDevice {\n    _hid_device: *mut ffi::HidDevice,\n}\n\nimpl HidDevice {\n    pub fn from_raw(device: *mut ffi::HidDevice) -> Self {\n        Self {\n            _hid_device: device,\n        }\n    }\n}\n\nunsafe impl Send for HidDevice {}\n\nimpl Debug for HidDevice {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"HidDevice\").finish()\n    }\n}\n\nimpl Drop for HidDevice {\n    fn drop(&mut self) {\n        unsafe { ffi::hid_close(self._hid_device) }\n    }\n}\n\nimpl HidDevice {\n    /// Check size returned by other methods, if it's equal to -1 check for\n    /// error and return Error, otherwise return size as unsigned number\n    fn check_size(&self, res: i32) -> HidResult<usize> {\n        if res == -1 {\n            match self.check_error() {\n                Ok(err) => Err(err),\n                Err(e) => Err(e),\n            }\n        } else {\n            Ok(res as usize)\n        }\n    }\n}\n\nimpl HidDeviceBackendBase for HidDevice {\n    fn check_error(&self) -> HidResult<HidError> {\n        Ok(HidError::HidApiError {\n            message: unsafe {\n                match wchar_to_string(ffi::hid_error(self._hid_device)) {\n                    WcharString::String(s) => s,\n                    _ => return Err(HidError::HidApiErrorEmpty),\n                }\n            },\n        })\n    }\n\n    fn write(&self, data: &[u8]) -> HidResult<usize> {\n        if data.is_empty() {\n            return Err(HidError::InvalidZeroSizeData);\n        }\n        let res = unsafe { ffi::hid_write(self._hid_device, data.as_ptr(), data.len() as size_t) };\n        self.check_size(res)\n    }\n\n    fn read(&self, buf: &mut [u8]) -> HidResult<usize> {\n        let res = unsafe { ffi::hid_read(self._hid_device, buf.as_mut_ptr(), buf.len() as size_t) };\n        self.check_size(res)\n    }\n\n    fn read_timeout(&self, buf: &mut [u8], timeout: i32) -> HidResult<usize> {\n        let res = unsafe {\n            ffi::hid_read_timeout(\n                self._hid_device,\n                buf.as_mut_ptr(),\n                buf.len() as size_t,\n                timeout,\n            )\n        };\n        self.check_size(res)\n    }\n\n    fn send_feature_report(&self, data: &[u8]) -> HidResult<()> {\n        if data.is_empty() {\n            return Err(HidError::InvalidZeroSizeData);\n        }\n        let res = unsafe {\n            ffi::hid_send_feature_report(self._hid_device, data.as_ptr(), data.len() as size_t)\n        };\n        let res = self.check_size(res)?;\n        if res != data.len() {\n            Err(HidError::IncompleteSendError {\n                sent: res,\n                all: data.len(),\n            })\n        } else {\n            Ok(())\n        }\n    }\n\n    /// Set the first byte of `buf` to the 'Report ID' of the report to be read.\n    /// Upon return, the first byte will still contain the Report ID, and the\n    /// report data will start in `buf[1]`.\n    fn get_feature_report(&self, buf: &mut [u8]) -> HidResult<usize> {\n        let res = unsafe {\n            ffi::hid_get_feature_report(self._hid_device, buf.as_mut_ptr(), buf.len() as size_t)\n        };\n        self.check_size(res)\n    }\n\n    fn send_output_report(&self, data: &[u8]) -> HidResult<()> {\n        if data.is_empty() {\n            return Err(HidError::InvalidZeroSizeData);\n        }\n        let res = unsafe {\n            ffi::hid_send_output_report(self._hid_device, data.as_ptr(), data.len() as size_t)\n        };\n        let res = self.check_size(res)?;\n        if res != data.len() {\n            Err(HidError::IncompleteSendError {\n                sent: res,\n                all: data.len(),\n            })\n        } else {\n            Ok(())\n        }\n    }\n\n    fn get_input_report(&self, data: &mut [u8]) -> HidResult<usize> {\n        if data.is_empty() {\n            return Err(HidError::InvalidZeroSizeData);\n        }\n        let res = unsafe {\n            ffi::hid_get_input_report(self._hid_device, data.as_mut_ptr(), data.len() as size_t)\n        };\n        self.check_size(res)\n    }\n\n    fn set_blocking_mode(&self, blocking: bool) -> HidResult<()> {\n        let res = unsafe {\n            ffi::hid_set_nonblocking(self._hid_device, if blocking { 0i32 } else { 1i32 })\n        };\n        if res == -1 {\n            Err(HidError::SetBlockingModeError {\n                mode: match blocking {\n                    true => \"blocking\",\n                    false => \"not blocking\",\n                },\n            })\n        } else {\n            Ok(())\n        }\n    }\n\n    fn get_manufacturer_string(&self) -> HidResult<Option<String>> {\n        let mut buf = [0 as wchar_t; STRING_BUF_LEN];\n        let res = unsafe {\n            ffi::hid_get_manufacturer_string(\n                self._hid_device,\n                buf.as_mut_ptr(),\n                STRING_BUF_LEN as size_t,\n            )\n        };\n        let res = self.check_size(res)?;\n        unsafe { Ok(wchar_to_string(buf[..res].as_ptr()).into()) }\n    }\n\n    fn get_product_string(&self) -> HidResult<Option<String>> {\n        let mut buf = [0 as wchar_t; STRING_BUF_LEN];\n        let res = unsafe {\n            ffi::hid_get_product_string(\n                self._hid_device,\n                buf.as_mut_ptr(),\n                STRING_BUF_LEN as size_t,\n            )\n        };\n        let res = self.check_size(res)?;\n        unsafe { Ok(wchar_to_string(buf[..res].as_ptr()).into()) }\n    }\n\n    fn get_serial_number_string(&self) -> HidResult<Option<String>> {\n        let mut buf = [0 as wchar_t; STRING_BUF_LEN];\n        let res = unsafe {\n            ffi::hid_get_serial_number_string(\n                self._hid_device,\n                buf.as_mut_ptr(),\n                STRING_BUF_LEN as size_t,\n            )\n        };\n        let res = self.check_size(res)?;\n        unsafe { Ok(wchar_to_string(buf[..res].as_ptr()).into()) }\n    }\n\n    fn get_indexed_string(&self, index: i32) -> HidResult<Option<String>> {\n        let mut buf = [0 as wchar_t; STRING_BUF_LEN];\n        let res = unsafe {\n            ffi::hid_get_indexed_string(\n                self._hid_device,\n                index as c_int,\n                buf.as_mut_ptr(),\n                STRING_BUF_LEN,\n            )\n        };\n        let res = self.check_size(res)?;\n        unsafe { Ok(wchar_to_string(buf[..res].as_ptr()).into()) }\n    }\n\n    fn get_device_info(&self) -> HidResult<DeviceInfo> {\n        let raw_device = unsafe { ffi::hid_get_device_info(self._hid_device) };\n        if raw_device.is_null() {\n            match self.check_error() {\n                Ok(err) | Err(err) => return Err(err),\n            }\n        }\n\n        unsafe { conv_hid_device_info(raw_device) }\n    }\n\n    fn get_report_descriptor(&self, buf: &mut [u8]) -> HidResult<usize> {\n        let res = unsafe {\n            ffi::hid_get_report_descriptor(self._hid_device, buf.as_mut_ptr(), buf.len())\n        };\n        self.check_size(res)\n    }\n}\n"
  },
  {
    "path": "src/lib.rs",
    "content": "// **************************************************************************\n// Copyright (c) 2015 Osspial All Rights Reserved.\n//\n// This file is part of hidapi-rs, based on hidapi_rust by Roland Ruckerbauer.\n// *************************************************************************\n\n//! This crate provides a rust abstraction over the features of the C library\n//! hidapi by [signal11](https://github.com/libusb/hidapi).\n//!\n//! # Usage\n//!\n//! This crate is [on crates.io](https://crates.io/crates/hidapi) and can be\n//! used by adding `hidapi` to the dependencies in your project's `Cargo.toml`.\n//!\n//! # Example\n//!\n//! ```rust,no_run\n//! extern crate hidapi;\n//!\n//! use hidapi::HidApi;\n//!\n//! fn main() {\n//!     println!(\"Printing all available hid devices:\");\n//!\n//!     match HidApi::new() {\n//!         Ok(api) => {\n//!             for device in api.device_list() {\n//!                 println!(\"{:04x}:{:04x}\", device.vendor_id(), device.product_id());\n//!             }\n//!         },\n//!         Err(e) => {\n//!             eprintln!(\"Error: {}\", e);\n//!         },\n//!     }\n//! }\n//! ```\n//!\n//! For more usage examples, please take a look at the `examples/` directory.\n//!\n//! # Feature flags\n//!\n//! - `linux-static-libusb`: uses statically linked `libusb` backend on Linux\n//! - `linux-static-hidraw`: uses statically linked `hidraw` backend on Linux (default)\n//! - `linux-shared-libusb`: uses dynamically linked `libusb` backend on Linux\n//! - `linux-shared-hidraw`: uses dynamically linked `hidraw` backend on Linux\n//! - `linux-native`: talks to hidraw directly without using the `hidapi` C library\n//! - `illumos-static-libusb`: uses statically linked `libusb` backend on Illumos (default)\n//! - `illumos-shared-libusb`: uses statically linked `hidraw` backend on Illumos\n//! - `macos-shared-device`: enables shared access to HID devices on MacOS\n//! - `windows-native`: talks to hid.dll directly without using the `hidapi` C library\n//!\n//! ## Linux backends\n//!\n//! On linux the libusb backends do not support [`DeviceInfo::usage()`] and [`DeviceInfo::usage_page()`].\n//! The hidraw backend has support for them, but it might be buggy in older kernel versions.\n//!\n//! ## MacOS Shared device access\n//!\n//! Since `hidapi` 0.12 it is possible to open MacOS devices with shared access, so that multiple\n//! [`HidDevice`] handles can access the same physical device. For backward compatibility this is\n//! an opt-in that can be enabled with the `macos-shared-device` feature flag.\n#![cfg_attr(docsrs, feature(doc_cfg))]\n\nmod error;\nmod ffi;\n\nuse cfg_if::cfg_if;\nuse libc::wchar_t;\nuse std::ffi::CStr;\nuse std::ffi::CString;\nuse std::fmt;\nuse std::fmt::Debug;\nuse std::sync::Mutex;\n\npub use error::HidError;\n\ncfg_if! {\n    if #[cfg(all(feature = \"linux-native\", target_os = \"linux\"))] {\n        //#[cfg_attr(docsrs, doc(cfg(all(feature = \"linux-native\", target_os = \"linux\"))))]\n        mod linux_native;\n        use linux_native::HidApiBackend;\n    } else if #[cfg(all(feature = \"windows-native\", target_os = \"windows\"))] {\n        //#[cfg_attr(docsrs, doc(cfg(all(feature = \"windows-native\", target_os = \"windows\"))))]\n        mod windows_native;\n        use windows_native::HidApiBackend;\n    } else if #[cfg(hidapi)] {\n        mod hidapi;\n        use hidapi::HidApiBackend;\n    } else {\n        compile_error!(\"No backend selected\");\n    }\n}\n\n// Automatically implement the top trait\ncfg_if! {\n    if #[cfg(target_os = \"windows\")] {\n        #[cfg_attr(docsrs, doc(cfg(target_os = \"windows\")))]\n        mod windows;\n        use windows::GUID;\n        /// A trait with the extra methods that are available on Windows\n        trait HidDeviceBackendWindows {\n            /// Get the container ID for a HID device\n            fn get_container_id(&self) -> HidResult<GUID>;\n        }\n        trait HidDeviceBackend: HidDeviceBackendBase + HidDeviceBackendWindows + Send {}\n        impl<T> HidDeviceBackend for T where T: HidDeviceBackendBase + HidDeviceBackendWindows + Send {}\n    } else if #[cfg(target_os = \"macos\")] {\n        #[cfg_attr(docsrs, doc(cfg(target_os = \"macos\")))]\n        mod macos;\n        /// A trait with the extra methods that are available on macOS\n        trait HidDeviceBackendMacos {\n            /// Get the location ID for a [`HidDevice`] device.\n            fn get_location_id(&self) -> HidResult<u32>;\n\n            /// Check if the device was opened in exclusive mode.\n            fn is_open_exclusive(&self) -> HidResult<bool>;\n        }\n        trait HidDeviceBackend: HidDeviceBackendBase + HidDeviceBackendMacos + Send {}\n        impl<T> HidDeviceBackend for T where T: HidDeviceBackendBase + HidDeviceBackendMacos + Send {}\n    } else {\n        trait HidDeviceBackend: HidDeviceBackendBase + Send {}\n        impl<T> HidDeviceBackend for T where T: HidDeviceBackendBase + Send {}\n    }\n}\n\npub type HidResult<T> = Result<T, HidError>;\npub const MAX_REPORT_DESCRIPTOR_SIZE: usize = 4096;\n\nstruct ContextState {\n    device_discovery: bool,\n    init_state: InitState,\n}\n\nenum InitState {\n    NotInit,\n    Init,\n}\n\n/// Global state to coordinate backing C library global context management.\nstatic CONTEXT_STATE: Mutex<ContextState> = Mutex::new(ContextState {\n    device_discovery: true,\n    init_state: InitState::NotInit,\n});\n\n/// `hidapi` context.\n///\n/// The `hidapi` C library is lazily initialized when creating the first instance,\n/// and never deinitialized. Therefore, it is allowed to create multiple `HidApi`\n/// instances.\n///\n/// Each instance has its own device list cache.\npub struct HidApi {\n    device_list: Vec<DeviceInfo>,\n}\n\nimpl HidApi {\n    /// Create a new hidapi context.\n    ///\n    /// Will also initialize the currently available device list if device discovery has not already\n    /// been [disabled](Self::disable_device_discovery).\n    pub fn new() -> HidResult<Self> {\n        let mut state = CONTEXT_STATE.lock().unwrap();\n\n        if let InitState::NotInit = state.init_state {\n            #[cfg(all(libusb, not(target_os = \"freebsd\")))]\n            if !state.device_discovery {\n                // Do not scan for devices in libusb_init()\n                // Must be set before calling it.\n                // This is needed on Android, where access to USB devices is limited\n                unsafe { ffi::libusb_set_option(std::ptr::null_mut(), 2) }\n            }\n\n            // Initialize the HID\n            #[cfg(hidapi)]\n            if unsafe { ffi::hid_init() } == -1 {\n                return Err(HidError::InitializationError);\n            }\n\n            #[cfg(all(target_os = \"macos\", feature = \"macos-shared-device\"))]\n            unsafe {\n                ffi::macos::hid_darwin_set_open_exclusive(0)\n            }\n\n            state.init_state = InitState::Init;\n        }\n\n        let mut api = HidApi {\n            device_list: Vec::with_capacity(8),\n        };\n        api.add_devices(0, 0)?;\n        Ok(api)\n    }\n\n    /// Disable device discovery on context creation.\n    ///\n    /// This may be necessary on Android, where access to USB device enumeration is limited.\n    ///\n    /// # Panics\n    ///\n    /// Panics if an hidapi context has already been initialized with device discovery.\n    ///\n    /// <section class=\"warning\">\n    ///\n    /// Avoid using this in library code, as it is an inherently global operation.\n    ///\n    /// This function is intended to be called by code that knows the environment it is running in.\n    /// Usually this means application code either directly, or through another abstraction.\n    ///\n    /// </section>\n    pub fn disable_device_discovery() {\n        let mut state = CONTEXT_STATE.lock().unwrap();\n\n        if let InitState::NotInit = state.init_state {\n            state.device_discovery = false; // Only disable device discovery before init.\n        } else if state.device_discovery {\n            core::mem::drop(state); // Make sure we don't poison the lock when panicking.\n            panic!(\"Cannot disable device discovery after HidApi has been initialized\");\n        }\n    }\n\n    /// Create a new hidapi context, after disabling discovery. Please avoid using this function in\n    /// library code, because it forces all instances of HidApi to disable device discovery.\n    ///\n    /// See [`HidApi::disable_device_discovery()`].\n    ///\n    /// # Panics\n    ///\n    /// Panics if an hidapi context has already been initialized with device discovery.\n    #[deprecated(\n        note = \"Please use only `HidApi::new()` in library code. Application code should disable device discovery explicitly.\"\n    )]\n    pub fn new_without_enumerate() -> HidResult<Self> {\n        Self::disable_device_discovery();\n        Self::new()\n    }\n\n    /// Refresh devices list and information about them (to access them use\n    /// `device_list()` method)\n    /// Identical to `reset_devices()` followed by `add_devices(0, 0)`.\n    pub fn refresh_devices(&mut self) -> HidResult<()> {\n        self.reset_devices()?;\n        self.add_devices(0, 0)?;\n        Ok(())\n    }\n\n    /// Reset devices list. Intended to be used with the `add_devices` method.\n    pub fn reset_devices(&mut self) -> HidResult<()> {\n        self.device_list.clear();\n        Ok(())\n    }\n\n    /// Indexes devices that match the given VID and PID filters.\n    /// 0 indicates no filter.\n    pub fn add_devices(&mut self, vid: u16, pid: u16) -> HidResult<()> {\n        self.device_list\n            .append(&mut HidApiBackend::get_hid_device_info_vector(vid, pid)?);\n        Ok(())\n    }\n\n    /// Returns iterator containing information about attached HID devices\n    /// that have been indexed, either by `refresh_devices` or `add_devices`.\n    pub fn device_list(&self) -> impl Iterator<Item = &DeviceInfo> {\n        self.device_list.iter()\n    }\n\n    /// Open a HID device using a Vendor ID (VID) and Product ID (PID).\n    ///\n    /// When multiple devices with the same vid and pid are available, then the\n    /// first one found in the internal device list will be used. There are however\n    /// no guarantees, which device this will be.\n    pub fn open(&self, vid: u16, pid: u16) -> HidResult<HidDevice> {\n        let dev = HidApiBackend::open(vid, pid)?;\n        Ok(HidDevice::from_backend(Box::new(dev)))\n    }\n\n    /// Open a HID device using a Vendor ID (VID), Product ID (PID) and\n    /// a serial number.\n    pub fn open_serial(&self, vid: u16, pid: u16, sn: &str) -> HidResult<HidDevice> {\n        let dev = HidApiBackend::open_serial(vid, pid, sn)?;\n        Ok(HidDevice::from_backend(Box::new(dev)))\n    }\n\n    /// The path name be determined by inspecting the device list available with [`HidApi::device_list`].\n    ///\n    /// Alternatively a platform-specific path name can be used (eg: /dev/hidraw0 on Linux).\n    pub fn open_path(&self, device_path: &CStr) -> HidResult<HidDevice> {\n        let dev = HidApiBackend::open_path(device_path)?;\n        Ok(HidDevice::from_backend(Box::new(dev)))\n    }\n\n    /// Open a HID device using libusb_wrap_sys_device.\n    #[cfg(libusb)]\n    pub fn wrap_sys_device(&self, sys_dev: isize, interface_num: i32) -> HidResult<HidDevice> {\n        let device = unsafe { ffi::hid_libusb_wrap_sys_device(sys_dev, interface_num) };\n\n        if device.is_null() {\n            match HidApiBackend::check_error() {\n                Ok(err) => Err(err),\n                Err(e) => Err(e),\n            }\n        } else {\n            let dev = hidapi::HidDevice::from_raw(device);\n            Ok(HidDevice::from_backend(Box::new(dev)))\n        }\n    }\n\n    /// Get the last non-device specific error, which happened in the underlying hidapi C library.\n    /// To get the last device specific error, use [`HidDevice::check_error`].\n    ///\n    /// The `Ok()` variant of the result will contain a [HidError::HidApiError](enum.HidError.html).\n    ///\n    /// When `Err()` is returned, then acquiring the error string from the hidapi C\n    /// library failed. The contained [HidError](enum.HidError.html) is the cause, why no error could\n    /// be fetched.\n    #[cfg(hidapi)]\n    #[deprecated(since = \"2.2.3\", note = \"use the return values from the other methods\")]\n    pub fn check_error(&self) -> HidResult<HidError> {\n        HidApiBackend::check_error()\n    }\n}\n\n#[allow(dead_code)]\n#[derive(Clone, PartialEq)]\nenum WcharString {\n    String(String),\n    #[cfg_attr(all(feature = \"linux-native\", target_os = \"linux\"), allow(dead_code))]\n    Raw(Vec<wchar_t>),\n    None,\n}\n\nimpl From<WcharString> for Option<String> {\n    fn from(val: WcharString) -> Self {\n        match val {\n            WcharString::String(s) => Some(s),\n            _ => None,\n        }\n    }\n}\n\n/// The underlying HID bus type.\n#[repr(C)]\n#[derive(Copy, Clone, Debug)]\npub enum BusType {\n    Unknown = 0x00,\n    Usb = 0x01,\n    Bluetooth = 0x02,\n    I2c = 0x03,\n    Spi = 0x04,\n}\n\n/// Device information. Use accessors to extract information about Hid devices.\n///\n/// Note: Methods like `serial_number()` may return None, if the conversion to a\n/// String failed internally. You can however access the raw hid representation of the\n/// string by calling `serial_number_raw()`\n#[derive(Clone)]\npub struct DeviceInfo {\n    path: CString,\n    vendor_id: u16,\n    product_id: u16,\n    serial_number: WcharString,\n    release_number: u16,\n    manufacturer_string: WcharString,\n    product_string: WcharString,\n    #[allow(dead_code)]\n    usage_page: u16,\n    #[allow(dead_code)]\n    usage: u16,\n    interface_number: i32,\n    bus_type: BusType,\n}\n\nimpl DeviceInfo {\n    pub fn path(&self) -> &CStr {\n        &self.path\n    }\n\n    pub fn vendor_id(&self) -> u16 {\n        self.vendor_id\n    }\n\n    pub fn product_id(&self) -> u16 {\n        self.product_id\n    }\n\n    /// Try to call `serial_number_raw()`, if None is returned.\n    pub fn serial_number(&self) -> Option<&str> {\n        match self.serial_number {\n            WcharString::String(ref s) => Some(s),\n            _ => None,\n        }\n    }\n\n    pub fn serial_number_raw(&self) -> Option<&[wchar_t]> {\n        match self.serial_number {\n            WcharString::Raw(ref s) => Some(s),\n            _ => None,\n        }\n    }\n\n    pub fn release_number(&self) -> u16 {\n        self.release_number\n    }\n\n    /// Try to call `manufacturer_string_raw()`, if None is returned.\n    pub fn manufacturer_string(&self) -> Option<&str> {\n        match self.manufacturer_string {\n            WcharString::String(ref s) => Some(s),\n            _ => None,\n        }\n    }\n\n    pub fn manufacturer_string_raw(&self) -> Option<&[wchar_t]> {\n        match self.manufacturer_string {\n            WcharString::Raw(ref s) => Some(s),\n            _ => None,\n        }\n    }\n\n    /// Try to call `product_string_raw()`, if None is returned.\n    pub fn product_string(&self) -> Option<&str> {\n        match self.product_string {\n            WcharString::String(ref s) => Some(s),\n            _ => None,\n        }\n    }\n\n    pub fn product_string_raw(&self) -> Option<&[wchar_t]> {\n        match self.product_string {\n            WcharString::Raw(ref s) => Some(s),\n            _ => None,\n        }\n    }\n\n    /// Usage page is not available on linux libusb backends\n    #[cfg(not(all(libusb, target_os = \"linux\")))]\n    pub fn usage_page(&self) -> u16 {\n        self.usage_page\n    }\n\n    /// Usage is not available on linux libusb backends\n    #[cfg(not(all(libusb, target_os = \"linux\")))]\n    pub fn usage(&self) -> u16 {\n        self.usage\n    }\n\n    pub fn interface_number(&self) -> i32 {\n        self.interface_number\n    }\n\n    pub fn bus_type(&self) -> BusType {\n        self.bus_type\n    }\n\n    /// Use the information contained in `DeviceInfo` to open\n    /// and return a handle to a [HidDevice](struct.HidDevice.html).\n    ///\n    /// By default the device path is used to open the device.\n    /// When no path is available, then vid, pid and serial number are used.\n    /// If both path and serial number are not available, then this function will\n    /// fail with [HidError::OpenHidDeviceWithDeviceInfoError](enum.HidError.html#variant.OpenHidDeviceWithDeviceInfoError).\n    ///\n    /// Note, that opening a device could still be done using [HidApi::open()](struct.HidApi.html#method.open) directly.\n    pub fn open_device(&self, hidapi: &HidApi) -> HidResult<HidDevice> {\n        if !self.path.as_bytes().is_empty() {\n            hidapi.open_path(self.path.as_c_str())\n        } else if let Some(sn) = self.serial_number() {\n            hidapi.open_serial(self.vendor_id, self.product_id, sn)\n        } else {\n            Err(HidError::OpenHidDeviceWithDeviceInfoError {\n                device_info: Box::new(self.clone()),\n            })\n        }\n    }\n}\n\nimpl fmt::Debug for DeviceInfo {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"HidDeviceInfo\")\n            .field(\"vendor_id\", &self.vendor_id)\n            .field(\"product_id\", &self.product_id)\n            .finish()\n    }\n}\n\n/// Trait which the different backends must implement\ntrait HidDeviceBackendBase {\n    #[cfg(hidapi)]\n    fn check_error(&self) -> HidResult<HidError>;\n    fn write(&self, data: &[u8]) -> HidResult<usize>;\n    fn read(&self, buf: &mut [u8]) -> HidResult<usize>;\n    fn read_timeout(&self, buf: &mut [u8], timeout: i32) -> HidResult<usize>;\n    fn send_feature_report(&self, data: &[u8]) -> HidResult<()>;\n    fn get_feature_report(&self, buf: &mut [u8]) -> HidResult<usize>;\n    fn send_output_report(&self, data: &[u8]) -> HidResult<()>;\n    #[cfg(any(hidapi, target_os = \"linux\"))]\n    fn get_input_report(&self, data: &mut [u8]) -> HidResult<usize>;\n    fn set_blocking_mode(&self, blocking: bool) -> HidResult<()>;\n    fn get_device_info(&self) -> HidResult<DeviceInfo>;\n    fn get_manufacturer_string(&self) -> HidResult<Option<String>>;\n    fn get_product_string(&self) -> HidResult<Option<String>>;\n    fn get_serial_number_string(&self) -> HidResult<Option<String>>;\n    fn get_report_descriptor(&self, buf: &mut [u8]) -> HidResult<usize>;\n\n    fn get_indexed_string(&self, _index: i32) -> HidResult<Option<String>> {\n        Err(HidError::HidApiError {\n            message: \"get_indexed_string: not supported\".to_string(),\n        })\n    }\n}\n\npub struct HidDevice {\n    inner: Box<dyn HidDeviceBackend>,\n}\n\nimpl Debug for HidDevice {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"HidDevice\").finish_non_exhaustive()\n    }\n}\n\nimpl HidDevice {\n    fn from_backend(inner: Box<dyn HidDeviceBackend>) -> Self {\n        Self { inner }\n    }\n}\n\n// Methods that use the backend\nimpl HidDevice {\n    /// Get the last error, which happened in the underlying hidapi C library.\n    ///\n    /// The `Ok()` variant of the result will contain a [HidError::HidApiError](enum.HidError.html).\n    ///\n    /// When `Err()` is returned, then acquiring the error string from the hidapi C\n    /// library failed. The contained [HidError](enum.HidError.html) is the cause, why no error could\n    /// be fetched.\n    #[cfg(hidapi)]\n    #[deprecated(since = \"2.2.3\", note = \"use the return values from the other methods\")]\n    pub fn check_error(&self) -> HidResult<HidError> {\n        self.inner.check_error()\n    }\n\n    /// Write an Output report to a HID device.\n    ///\n    /// The first byte of `data` must contain the Report ID. For\n    /// devices which only support a single report, this must be set\n    /// to 0x0. The remaining bytes contain the report data. Since\n    /// the Report ID is mandatory, calls to `write()` will always\n    /// contain one more byte than the report contains. For example,\n    /// if a hid report is 16 bytes long, 17 bytes must be passed to\n    /// `write()`, the Report ID (or 0x0, for devices with a\n    /// single report), followed by the report data (16 bytes). In\n    /// this example, the length passed in would be 17.\n    /// `write()` will send the data on the first OUT endpoint, if\n    /// one exists. If it does not, it will send the data through\n    /// the Control Endpoint (Endpoint 0).\n    ///\n    /// If successful, returns the actual number of bytes written.\n    pub fn write(&self, data: &[u8]) -> HidResult<usize> {\n        self.inner.write(data)\n    }\n\n    /// Read an Input report from a HID device.\n    ///\n    /// Input reports are returned to the host through the 'INTERRUPT IN'\n    /// endpoint. The first byte will contain the Report number if the device\n    /// uses numbered reports.\n    ///\n    /// If successful, returns the actual number of bytes read.\n    pub fn read(&self, buf: &mut [u8]) -> HidResult<usize> {\n        self.inner.read(buf)\n    }\n\n    /// Read an Input report from a HID device with timeout.\n    ///\n    /// Input reports are returned to the host through the 'INTERRUPT IN'\n    /// endpoint. The first byte will contain the Report number if the device\n    /// uses numbered reports. Timeout measured in milliseconds, set -1 for\n    /// blocking wait.\n    ///\n    /// If successful, returns the actual number of bytes read.\n    pub fn read_timeout(&self, buf: &mut [u8], timeout: i32) -> HidResult<usize> {\n        self.inner.read_timeout(buf, timeout)\n    }\n\n    /// Send a Feature report to the device.\n    ///\n    /// Feature reports are sent over the Control endpoint as a\n    /// Set_Report transfer.  The first byte of `data` must contain the\n    /// 'Report ID'. For devices which only support a single report, this must\n    /// be set to 0x0. The remaining bytes contain the report data. Since the\n    /// 'Report ID' is mandatory, calls to `send_feature_report()` will always\n    /// contain one more byte than the report contains. For example, if a hid\n    /// report is 16 bytes long, 17 bytes must be passed to\n    /// `send_feature_report()`: 'the Report ID' (or 0x0, for devices which\n    /// do not use numbered reports), followed by the report data (16 bytes).\n    /// In this example, the length passed in would be 17.\n    pub fn send_feature_report(&self, data: &[u8]) -> HidResult<()> {\n        self.inner.send_feature_report(data)\n    }\n\n    /// Get a feature report from a HID device.\n    ///\n    /// Set the first byte of `buf` to the 'Report ID' of the report to be read.\n    /// Upon return, the first byte will still contain the Report ID, and the\n    /// report data will start in `buf[1]`.\n    ///\n    /// If successful, returns the number of bytes read plus one for the report ID (which is still\n    /// in the first byte).\n    pub fn get_feature_report(&self, buf: &mut [u8]) -> HidResult<usize> {\n        self.inner.get_feature_report(buf)\n    }\n\n    /// Send a Output report to the device.\n    ///\n    /// Output reports are sent over the Control endpoint as a Set_Report\n    /// transfer. The first byte of data[] must contain the Report ID.\n    /// For devices which only support a single report, this must be set\n    /// to 0x0. The remaining bytes contain the report data. Since the\n    /// Report ID is mandatory, calls to hid_send_output_report() will\n    /// always contain one more byte than the report contains. For example,\n    ///  if a hid report is 16 bytes long, 17 bytes must be passed to\n    ///  hid_send_output_report(): the Report ID (or 0x0, for devices\n    /// which do not use numbered reports), followed by the report\n    /// data (16 bytes). In this example, the length passed in\n    /// would be 17.\n    pub fn send_output_report(&self, data: &[u8]) -> HidResult<()> {\n        self.inner.send_output_report(data)\n    }\n\n    /// Get a input report from a HID device\n    ///\n    /// Set the first byte of data to the report id of the report to be read.\n    /// Set the first byte to zero if your device does not use numbered reports.\n    /// After calling the function, the first byte will still contain the same report id.\n    ///\n    /// If successful, returns the number of bytes read plus one for the report ID (which is still\n    /// in the first byte).\n    #[cfg(any(hidapi, target_os = \"linux\"))]\n    pub fn get_input_report(&self, data: &mut [u8]) -> HidResult<usize> {\n        self.inner.get_input_report(data)\n    }\n\n    /// Set the device handle to be in blocking or in non-blocking mode. In\n    /// non-blocking mode calls to `read()` will return immediately with an empty\n    /// slice if there is no data to be read. In blocking mode, `read()` will\n    /// wait (block) until there is data to read before returning.\n    /// Modes can be changed at any time.\n    pub fn set_blocking_mode(&self, blocking: bool) -> HidResult<()> {\n        self.inner.set_blocking_mode(blocking)\n    }\n\n    /// Get The Manufacturer String from a HID device.\n    pub fn get_manufacturer_string(&self) -> HidResult<Option<String>> {\n        self.inner.get_manufacturer_string()\n    }\n\n    /// Get The Manufacturer String from a HID device.\n    pub fn get_product_string(&self) -> HidResult<Option<String>> {\n        self.inner.get_product_string()\n    }\n\n    /// Get The Serial Number String from a HID device.\n    pub fn get_serial_number_string(&self) -> HidResult<Option<String>> {\n        self.inner.get_serial_number_string()\n    }\n\n    /// Get a string from a HID device, based on its string index.\n    pub fn get_indexed_string(&self, index: i32) -> HidResult<Option<String>> {\n        self.inner.get_indexed_string(index)\n    }\n\n    /// Get a report descriptor from a HID device\n    ///\n    /// User has to provide a preallocated buffer where the descriptor will be copied to.\n    /// It is recommended to use a preallocated buffer of [`MAX_REPORT_DESCRIPTOR_SIZE`] size.\n    ///\n    /// On success returns the number of bytes actually filled into `buf`\n    pub fn get_report_descriptor(&self, buf: &mut [u8]) -> HidResult<usize> {\n        self.inner.get_report_descriptor(buf)\n    }\n\n    /// Get [`DeviceInfo`] from a HID device.\n    pub fn get_device_info(&self) -> HidResult<DeviceInfo> {\n        self.inner.get_device_info()\n    }\n}\n"
  },
  {
    "path": "src/linux_native/ioctl.rs",
    "content": "//! The IOCTL calls we need for the native linux backend\n\nuse nix::{ioctl_read, ioctl_read_buf, ioctl_write_buf};\n\n// From linux/hidraw.h\nconst HIDRAW_IOC_MAGIC: u8 = b'H';\nconst HIDRAW_IOC_GRDESCSIZE: u8 = 0x01;\nconst HIDRAW_SET_FEATURE: u8 = 0x06;\nconst HIDRAW_GET_FEATURE: u8 = 0x07;\nconst HIDRAW_SET_OUTPUT: u8 = 0x0b;\nconst HIDRAW_GET_INPUT: u8 = 0x0a;\n\nioctl_read!(\n    hidraw_ioc_grdescsize,\n    HIDRAW_IOC_MAGIC,\n    HIDRAW_IOC_GRDESCSIZE,\n    libc::c_int\n);\n\nioctl_write_buf!(\n    hidraw_ioc_set_feature,\n    HIDRAW_IOC_MAGIC,\n    HIDRAW_SET_FEATURE,\n    u8\n);\nioctl_read_buf!(\n    hidraw_ioc_get_feature,\n    HIDRAW_IOC_MAGIC,\n    HIDRAW_GET_FEATURE,\n    u8\n);\nioctl_write_buf!(\n    hidraw_ioc_set_output,\n    HIDRAW_IOC_MAGIC,\n    HIDRAW_SET_OUTPUT,\n    u8\n);\nioctl_read_buf!(hidraw_ioc_get_input, HIDRAW_IOC_MAGIC, HIDRAW_GET_INPUT, u8);\n"
  },
  {
    "path": "src/linux_native.rs",
    "content": "//! This backend uses libudev to discover devices and then talks to hidraw directly\n\nmod ioctl;\n\n#[cfg(feature = \"linux-native-basic-udev\")]\nuse basic_udev as udev;\n\nuse std::{\n    cell::{Cell, Ref, RefCell},\n    ffi::{CStr, CString, OsStr, OsString},\n    fs::{File, OpenOptions},\n    io::{Cursor, Read, Seek, SeekFrom},\n    os::{\n        fd::{AsFd, AsRawFd, BorrowedFd, OwnedFd},\n        unix::{ffi::OsStringExt, fs::OpenOptionsExt},\n    },\n    path::{Path, PathBuf},\n};\n\nuse libc::wchar_t;\nuse nix::{\n    errno::Errno,\n    poll::{poll, PollFd, PollFlags, PollTimeout},\n    sys::stat::{fstat, major, minor},\n    unistd::{read, write},\n};\n\nuse super::{BusType, DeviceInfo, HidDeviceBackendBase, HidError, HidResult, WcharString};\nuse ioctl::{\n    hidraw_ioc_get_feature, hidraw_ioc_get_input, hidraw_ioc_grdescsize, hidraw_ioc_set_feature,\n    hidraw_ioc_set_output,\n};\n\n// Bus values from linux/input.h\nconst BUS_USB: u16 = 0x03;\nconst BUS_BLUETOOTH: u16 = 0x05;\nconst BUS_I2C: u16 = 0x18;\nconst BUS_SPI: u16 = 0x1C;\n\npub struct HidApiBackend;\n\nimpl HidApiBackend {\n    pub fn get_hid_device_info_vector(vid: u16, pid: u16) -> HidResult<Vec<DeviceInfo>> {\n        // The C version assumes these can't fail, and they should only fail in case\n        // of memory allocation issues, at which point maybe we should panic\n        let mut enumerator = match udev::Enumerator::new() {\n            Ok(e) => e,\n            Err(_) => return Ok(Vec::new()),\n        };\n        enumerator.match_subsystem(\"hidraw\").unwrap();\n        let scan = match enumerator.scan_devices() {\n            Ok(s) => s,\n            Err(_) => return Ok(Vec::new()),\n        };\n\n        let devices = scan\n            .filter_map(|device| device_to_hid_device_info(&device))\n            .flatten()\n            .filter(|device| vid == 0 || device.vendor_id == vid)\n            .filter(|device| pid == 0 || device.product_id == pid)\n            .collect::<Vec<_>>();\n\n        Ok(devices)\n    }\n\n    pub fn open(vid: u16, pid: u16) -> HidResult<HidDevice> {\n        HidDevice::open(vid, pid, None)\n    }\n\n    pub fn open_serial(vid: u16, pid: u16, sn: &str) -> HidResult<HidDevice> {\n        HidDevice::open(vid, pid, Some(sn))\n    }\n\n    pub fn open_path(device_path: &CStr) -> HidResult<HidDevice> {\n        HidDevice::open_path(device_path)\n    }\n}\n\nfn device_to_hid_device_info(raw_device: &udev::Device) -> Option<Vec<DeviceInfo>> {\n    let mut infos = Vec::new();\n\n    // We're given the hidraw device, but we actually want to go and check out\n    // the info for the parent hid device.\n    let device = match raw_device.parent_with_subsystem(\"hid\") {\n        Ok(Some(dev)) => dev,\n        _ => return None,\n    };\n\n    let (bus, vid, pid) = device\n        .property_value(\"HID_ID\")\n        .and_then(|s| s.to_str())\n        .and_then(parse_hid_vid_pid)?;\n    let bus_type = match bus {\n        BUS_USB => BusType::Usb,\n        BUS_BLUETOOTH => BusType::Bluetooth,\n        BUS_I2C => BusType::I2c,\n        BUS_SPI => BusType::Spi,\n        _ => return None,\n    };\n    let name = device.property_value(\"HID_NAME\")?;\n    let serial = device.property_value(\"HID_UNIQ\")?;\n    let path = match raw_device\n        .devnode()\n        .map(|p| p.as_os_str().to_os_string().into_vec())\n        .map(CString::new)\n    {\n        Some(Ok(s)) => s,\n        None | Some(Err(_)) => return None,\n    };\n\n    // Thus far we've gathered all the common attributes.\n    let info = DeviceInfo {\n        path,\n        vendor_id: vid,\n        product_id: pid,\n        serial_number: osstring_to_string(serial.into()),\n        release_number: 0,\n        manufacturer_string: WcharString::None,\n        product_string: WcharString::None,\n        usage_page: 0,\n        usage: 0,\n        interface_number: -1,\n        bus_type,\n    };\n\n    // USB has a bunch more information but everything else gets the same empty\n    // manufacturer and the product we read from the property above.\n    let info = match bus_type {\n        BusType::Usb => fill_in_usb(raw_device, info, name),\n        _ => DeviceInfo {\n            manufacturer_string: WcharString::String(\"\".into()),\n            product_string: osstring_to_string(name.into()),\n            ..info\n        },\n    };\n\n    if let Ok(descriptor) = HidrawReportDescriptor::from_syspath(raw_device.syspath()) {\n        let mut usages = descriptor.usages();\n\n        // Get the first usage page and usage for our current DeviceInfo\n        if let Some((usage_page, usage)) = usages.next() {\n            infos.push(DeviceInfo {\n                usage_page,\n                usage,\n                ..info\n            });\n\n            // Now we can create DeviceInfo for all the other usages\n            for (usage_page, usage) in usages {\n                let prev = infos.last().unwrap();\n\n                infos.push(DeviceInfo {\n                    usage_page,\n                    usage,\n                    ..prev.clone()\n                })\n            }\n        }\n    } else {\n        infos.push(info);\n    }\n\n    Some(infos)\n}\n\n/// Fill in the extra information that's available for a USB device.\nfn fill_in_usb(device: &udev::Device, info: DeviceInfo, name: &OsStr) -> DeviceInfo {\n    let usb_dev = match device.parent_with_subsystem_devtype(\"usb\", \"usb_device\") {\n        Ok(Some(dev)) => dev,\n        Ok(None) | Err(_) => {\n            return DeviceInfo {\n                manufacturer_string: WcharString::String(\"\".into()),\n                product_string: osstring_to_string(name.into()),\n                ..info\n            }\n        }\n    };\n    let manufacturer_string = attribute_as_wchar(&usb_dev, \"manufacturer\");\n    let product_string = attribute_as_wchar(&usb_dev, \"product\");\n    let release_number = attribute_as_u16(&usb_dev, \"bcdDevice\").unwrap_or(0);\n    let interface_number = device\n        .parent_with_subsystem_devtype(\"usb\", \"usb_interface\")\n        .ok()\n        .flatten()\n        .and_then(|ref dev| attribute_as_i32(dev, \"bInterfaceNumber\"))\n        .unwrap_or(-1);\n\n    DeviceInfo {\n        release_number,\n        manufacturer_string,\n        product_string,\n        interface_number,\n        ..info\n    }\n}\n\n#[derive(Default)]\nstruct HidrawReportDescriptor(Vec<u8>);\n\nimpl HidrawReportDescriptor {\n    /// Open and parse given the \"base\" sysfs of the device\n    pub fn from_syspath(syspath: &Path) -> HidResult<Self> {\n        let path = syspath.join(\"device/report_descriptor\");\n        let mut f = File::open(path)?;\n        let mut buf = Vec::new();\n        f.read_to_end(&mut buf)?;\n\n        Ok(HidrawReportDescriptor(buf))\n    }\n\n    /// Create a descriptor from a slice\n    ///\n    /// It returns an error if the value slice is too large for it to be a HID\n    /// descriptor\n    #[cfg_attr(not(test), allow(dead_code))]\n    pub fn from_slice(value: &[u8]) -> HidResult<Self> {\n        Ok(HidrawReportDescriptor(value.to_vec()))\n    }\n\n    pub fn usages(&self) -> impl Iterator<Item = (u16, u16)> + '_ {\n        UsageIterator {\n            usage_page: 0,\n            cursor: Cursor::new(&self.0),\n        }\n    }\n}\n\n/// Iterates over the values in a HidrawReportDescriptor\nstruct UsageIterator<'a> {\n    usage_page: u16,\n    cursor: Cursor<&'a Vec<u8>>,\n}\n\nimpl<'a> Iterator for UsageIterator<'a> {\n    type Item = (u16, u16);\n\n    fn next(&mut self) -> Option<Self::Item> {\n        let (usage_page, page) = next_hid_usage(&mut self.cursor, self.usage_page)?;\n\n        self.usage_page = usage_page;\n        Some((usage_page, page))\n    }\n}\n\n// This comes from hidapi which apparently comes from Apple's implementation of\n// this\nfn next_hid_usage(cursor: &mut Cursor<&Vec<u8>>, mut usage_page: u16) -> Option<(u16, u16)> {\n    let mut usage = None;\n    let mut usage_pair = None;\n    let initial = cursor.position() == 0;\n\n    while let Some(Ok(key)) = cursor.bytes().next() {\n        // The amount to skip is calculated based off of the start of the\n        // iteration so we need to keep track of that.\n        let position = cursor.position() - 1;\n        let key_cmd = key & 0xfc;\n\n        let (data_len, key_size) = hid_item_size(key, cursor)?;\n\n        match key_cmd {\n            // Usage Page 6.2.2.7 (Global)\n            0x4 => {\n                usage_page = match hid_report_bytes(cursor, data_len) {\n                    Ok(v) => v as u16,\n                    Err(_) => break,\n                }\n            }\n            // Usage 6.2.2.8 (Local)\n            0x8 => {\n                usage = match hid_report_bytes(cursor, data_len) {\n                    Ok(v) => Some(v as u16),\n                    Err(_) => break,\n                }\n            }\n            // Collection 6.2.2.4 (Main)\n            0xa0 => {\n                // Usage is a Local Item, unset it\n                if let Some(u) = usage.take() {\n                    usage_pair = Some((usage_page, u))\n                }\n            }\n            // Input 6.2.2.4 (Main)\n\t\t        0x80 |\n            // Output 6.2.2.4 (Main)\n\t\t        0x90 |\n            // Feature 6.2.2.4 (Main)\n\t\t        0xb0 |\n            // End Collection 6.2.2.4 (Main)\n\t    0xc0  =>  {\n\t\t// Usage is a Local Item, unset it\n                usage.take();\n            }\n            _ => {}\n        }\n\n        if cursor\n            .seek(SeekFrom::Start(position + (data_len + key_size) as u64))\n            .is_err()\n        {\n            return None;\n        }\n\n        if let Some((usage_page, usage)) = usage_pair {\n            return Some((usage_page, usage));\n        }\n    }\n\n    if let (true, Some(usage)) = (initial, usage) {\n        return Some((usage_page, usage));\n    }\n\n    None\n}\n\n/// Gets the size of the HID item at the given position\n///\n/// Returns data_len and key_size when successful\nfn hid_item_size(key: u8, cursor: &mut Cursor<&Vec<u8>>) -> Option<(usize, usize)> {\n    // Long Item. Next byte contains the length of the data section.\n    if (key & 0xf0) == 0xf0 {\n        if let Some(Ok(len)) = cursor.bytes().next() {\n            return Some((len.into(), 3));\n        }\n\n        // Malformed report\n        return None;\n    }\n\n    // Short Item. Bottom two bits contains the size code\n    match key & 0x03 {\n        v @ 0..=2 => Some((v.into(), 1)),\n        3 => Some((4, 1)),\n        _ => unreachable!(), // & 0x03 means this can't happen\n    }\n}\n\n/// Get the bytes from a HID report descriptor\n///\n/// Must only be called with `num_bytes` 0, 1, 2 or 4.\nfn hid_report_bytes(cursor: &mut Cursor<&Vec<u8>>, num_bytes: usize) -> HidResult<u32> {\n    let mut bytes: [u8; 4] = [0; 4];\n    cursor.read_exact(&mut bytes[..num_bytes])?;\n\n    Ok(u32::from_le_bytes(bytes))\n}\n\n/// Get the attribute from the device and convert it into a [`WcharString`].\nfn attribute_as_wchar(dev: &udev::Device, attr: &str) -> WcharString {\n    dev.attribute_value(attr)\n        .map(Into::into)\n        .map(osstring_to_string)\n        .unwrap_or(WcharString::None)\n}\n\n/// Get the attribute from the device and convert it into a i32\n///\n/// On error or if the attribute is not found, it returns None.\nfn attribute_as_i32(dev: &udev::Device, attr: &str) -> Option<i32> {\n    dev.attribute_value(attr)\n        .and_then(OsStr::to_str)\n        .and_then(|v| i32::from_str_radix(v, 16).ok())\n}\n\n/// Get the attribute from the device and convert it into a u16\n///\n/// On error or if the attribute is not found, it returns None.\nfn attribute_as_u16(dev: &udev::Device, attr: &str) -> Option<u16> {\n    dev.attribute_value(attr)\n        .and_then(OsStr::to_str)\n        .and_then(|v| u16::from_str_radix(v, 16).ok())\n}\n\n/// Convert a [`OsString`] into a [`WcharString`]\nfn osstring_to_string(s: OsString) -> WcharString {\n    match s.into_string() {\n        Ok(s) => WcharString::String(s),\n        Err(s) => {\n            // We have an array of u8s but wchar_t is i32 so we need to convert\n            // them. This comes from hidapi starting from wchar_t but we start\n            // from UTF-8 or whatever the OS or device gave us. We can at least\n            // try to copy as much valid Unicode as there might be in the string\n            let mut buf: Vec<wchar_t> = Vec::with_capacity(s.len());\n            for chunk in s.into_vec().utf8_chunks() {\n                // Each chunk contains first the valid portion and then invalid portion\n                for c in chunk.valid().chars() {\n                    buf.push(c as wchar_t);\n                }\n                for c in chunk.invalid() {\n                    buf.push(*c as wchar_t);\n                }\n            }\n\n            WcharString::Raw(buf)\n        }\n    }\n}\n\n/// Parse a HID_ID string to find the bus type, the vendor and product id\n///\n/// These strings would be of the format\n///     type vendor   product\n///     0003:000005AC:00008242\nfn parse_hid_vid_pid(s: &str) -> Option<(u16, u16, u16)> {\n    let mut elems = s.split(':').map(|s| u16::from_str_radix(s, 16));\n    let devtype = elems.next()?.ok()?;\n    let vendor = elems.next()?.ok()?;\n    let product = elems.next()?.ok()?;\n\n    Some((devtype, vendor, product))\n}\n\n/// Object for accessing the HID device\npub struct HidDevice {\n    blocking: Cell<bool>,\n    fd: OwnedFd,\n    info: RefCell<Option<DeviceInfo>>,\n}\n\nunsafe impl Send for HidDevice {}\n\n// API for the library to call us, or for internal uses\nimpl HidDevice {\n    pub(crate) fn open(vid: u16, pid: u16, sn: Option<&str>) -> HidResult<Self> {\n        for device in HidApiBackend::get_hid_device_info_vector(0, 0)?\n            .iter()\n            .filter(|device| device.vendor_id == vid && device.product_id == pid)\n        {\n            match (sn, &device.serial_number) {\n                (None, _) => return Self::open_path(&device.path),\n                (Some(sn), WcharString::String(serial_number)) if sn == serial_number => {\n                    return Self::open_path(&device.path)\n                }\n                _ => continue,\n            };\n        }\n\n        Err(HidError::HidApiError {\n            message: \"device not found\".into(),\n        })\n    }\n\n    pub(crate) fn open_path(device_path: &CStr) -> HidResult<HidDevice> {\n        // Paths on Linux can be anything but devnode paths are going to be ASCII\n        let path = device_path.to_str().expect(\"path must be utf-8\");\n        let fd: OwnedFd = match OpenOptions::new()\n            .read(true)\n            .write(true)\n            .custom_flags(libc::O_CLOEXEC | libc::O_NONBLOCK)\n            .open(path)\n        {\n            Ok(f) => f.into(),\n            Err(e) => {\n                return Err(HidError::HidApiError {\n                    message: format!(\"failed to open device with path {path}: {e}\"),\n                });\n            }\n        };\n\n        let mut size = 0_i32;\n        if let Err(e) = unsafe { hidraw_ioc_grdescsize(fd.as_raw_fd(), &mut size) } {\n            return Err(HidError::HidApiError {\n                message: format!(\"ioctl(GRDESCSIZE) error for {path}, not a HIDRAW device?: {e}\"),\n            });\n        }\n\n        Ok(Self {\n            blocking: Cell::new(true),\n            fd,\n            info: RefCell::new(None),\n        })\n    }\n\n    fn info(&self) -> HidResult<Ref<'_, DeviceInfo>> {\n        if self.info.borrow().is_none() {\n            let info = self.get_device_info()?;\n            self.info.replace(Some(info));\n        }\n\n        let info = self.info.borrow();\n        Ok(Ref::map(info, |i: &Option<DeviceInfo>| i.as_ref().unwrap()))\n    }\n}\n\nimpl AsFd for HidDevice {\n    fn as_fd(&self) -> BorrowedFd<'_> {\n        self.fd.as_fd()\n    }\n}\n\nimpl HidDeviceBackendBase for HidDevice {\n    fn write(&self, data: &[u8]) -> HidResult<usize> {\n        if data.is_empty() {\n            return Err(HidError::InvalidZeroSizeData);\n        }\n\n        Ok(write(self.fd.as_fd(), data)?)\n    }\n\n    fn read(&self, buf: &mut [u8]) -> HidResult<usize> {\n        // If the caller asked for blocking, -1 makes us wait forever\n        let timeout = if self.blocking.get() { -1 } else { 0 };\n        self.read_timeout(buf, timeout)\n    }\n\n    fn read_timeout(&self, buf: &mut [u8], timeout: i32) -> HidResult<usize> {\n        let poll_timeout = PollTimeout::try_from(timeout).map_err(|_| HidError::HidApiError {\n            message: format!(\"invalid timeout value {timeout}\"),\n        })?;\n\n        let mut pollfds = [PollFd::new(self.fd.as_fd(), PollFlags::POLLIN)];\n        let res = poll(&mut pollfds, poll_timeout)?;\n\n        if res == 0 {\n            return Ok(0);\n        }\n\n        let events = pollfds[0]\n            .revents()\n            .map(|e| e.intersects(PollFlags::POLLERR | PollFlags::POLLHUP | PollFlags::POLLNVAL));\n\n        if events.is_none() || events == Some(true) {\n            return Err(HidError::HidApiError {\n                message: \"unexpected poll error (device disconnected)\".into(),\n            });\n        }\n\n        match read(self.fd.as_fd(), buf) {\n            Ok(w) => Ok(w),\n            Err(Errno::EAGAIN) | Err(Errno::EINPROGRESS) => Ok(0),\n            Err(e) => Err(e.into()),\n        }\n    }\n\n    fn send_feature_report(&self, data: &[u8]) -> HidResult<()> {\n        if data.is_empty() {\n            return Err(HidError::InvalidZeroSizeData);\n        }\n\n        let res = match unsafe { hidraw_ioc_set_feature(self.fd.as_raw_fd(), data) } {\n            Ok(n) => n as usize,\n            Err(e) => {\n                return Err(HidError::HidApiError {\n                    message: format!(\"ioctl (GFEATURE): {e}\"),\n                })\n            }\n        };\n\n        if res != data.len() {\n            return Err(HidError::IncompleteSendError {\n                sent: res,\n                all: data.len(),\n            });\n        }\n\n        Ok(())\n    }\n\n    fn get_feature_report(&self, buf: &mut [u8]) -> HidResult<usize> {\n        let res = match unsafe { hidraw_ioc_get_feature(self.fd.as_raw_fd(), buf) } {\n            Ok(n) => n as usize,\n            Err(e) => {\n                return Err(HidError::HidApiError {\n                    message: format!(\"ioctl (GFEATURE): {e}\"),\n                })\n            }\n        };\n\n        Ok(res)\n    }\n\n    fn send_output_report(&self, buf: &[u8]) -> HidResult<()> {\n        let res = match unsafe { hidraw_ioc_set_output(self.fd.as_raw_fd(), buf) } {\n            Ok(n) => n,\n            Err(e) => {\n                return Err(HidError::HidApiError {\n                    message: format!(\"ioctl (SOUTPUT): {e}\"),\n                });\n            }\n        };\n\n        if res as usize != buf.len() {\n            return Err(HidError::IncompleteSendError {\n                sent: res as usize,\n                all: buf.len(),\n            });\n        }\n\n        Ok(())\n    }\n\n    fn get_input_report(&self, data: &mut [u8]) -> HidResult<usize> {\n        match unsafe { hidraw_ioc_get_input(self.fd.as_raw_fd(), data) } {\n            Ok(n) => Ok(n as usize),\n            Err(e) => Err(HidError::HidApiError {\n                message: format!(\"ioctl (GINPUT): {e}\"),\n            }),\n        }\n    }\n\n    fn set_blocking_mode(&self, blocking: bool) -> HidResult<()> {\n        self.blocking.set(blocking);\n        Ok(())\n    }\n\n    fn get_manufacturer_string(&self) -> HidResult<Option<String>> {\n        let info = self.info()?;\n        Ok(info.manufacturer_string().map(str::to_string))\n    }\n\n    fn get_product_string(&self) -> HidResult<Option<String>> {\n        let info = self.info()?;\n        Ok(info.product_string().map(str::to_string))\n    }\n\n    fn get_serial_number_string(&self) -> HidResult<Option<String>> {\n        let info = self.info()?;\n        Ok(info.serial_number().map(str::to_string))\n    }\n\n    fn get_device_info(&self) -> HidResult<DeviceInfo> {\n        // What we have is a descriptor to a file in /dev but we need a syspath\n        // so we get the major/minor from there and generate our syspath\n        let devnum = fstat(self.fd.as_fd())?.st_rdev;\n        let syspath: PathBuf = format!(\"/sys/dev/char/{}:{}\", major(devnum), minor(devnum)).into();\n\n        // The clone is a bit silly but we can't implement Copy. Maybe it's not\n        // much worse than doing the conversion to Rust from interacting with C.\n        let device = udev::Device::from_syspath(&syspath)?;\n        match device_to_hid_device_info(&device) {\n            Some(info) => Ok(info[0].clone()),\n            None => Err(HidError::HidApiError {\n                message: \"failed to create device info\".into(),\n            }),\n        }\n    }\n\n    fn get_report_descriptor(&self, buf: &mut [u8]) -> HidResult<usize> {\n        let devnum = fstat(self.fd.as_fd())?.st_rdev;\n        let syspath: PathBuf = format!(\"/sys/dev/char/{}:{}\", major(devnum), minor(devnum)).into();\n\n        let descriptor = HidrawReportDescriptor::from_syspath(&syspath)?;\n        let min_size = buf.len().min(descriptor.0.len());\n        buf[..min_size].copy_from_slice(&descriptor.0[..min_size]);\n        Ok(min_size)\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n\n    #[test]\n    fn test_parse_hid_vid_pid() {\n        assert_eq!(None, parse_hid_vid_pid(\"Hello World\"));\n        assert_eq!(Some((1, 1, 1)), parse_hid_vid_pid(\"1:1:1\"));\n        assert_eq!(Some((0x11, 0x17, 0x18)), parse_hid_vid_pid(\"11:0017:00018\"));\n    }\n\n    #[test]\n    fn test_hidraw_report_descriptor_1() {\n        let data = include_bytes!(\"../tests/assets/mouse1.data\");\n        let desc = HidrawReportDescriptor::from_slice(&data[..]).expect(\"descriptor\");\n        let values = desc.usages().collect::<Vec<_>>();\n\n        assert_eq!(vec![(65468, 136)], values);\n    }\n\n    #[test]\n    fn test_hidraw_report_descriptor_2() {\n        let data = include_bytes!(\"../tests/assets/mouse2.data\");\n        let desc = HidrawReportDescriptor::from_slice(&data[..]).expect(\"descriptor\");\n        let values = desc.usages().collect::<Vec<_>>();\n\n        let expected = vec![(1, 2), (1, 1), (1, 128), (12, 1), (65280, 14)];\n        assert_eq!(expected, values);\n    }\n\n    #[test]\n    fn invalid_string_conversion() {\n        let good = OsStr::new(\"hello world\").to_os_string();\n        assert!(matches!(osstring_to_string(good), WcharString::String(s) if s == \"hello world\"));\n\n        // Value found in the field that made us panic\n        let bad_bytes: Vec<u8> = vec![0xD6, 0x34, 0x25, 0xB9, 0x04, 0x1c, 0xA4, 0xFD];\n        let bad_chars = bad_bytes.iter().map(|c| *c as wchar_t).collect::<Vec<_>>();\n        let bad = OsString::from_vec(bad_bytes);\n        assert!(matches!(osstring_to_string(bad), WcharString::Raw(v) if v == bad_chars));\n\n        // Check that we do convert Unicode chars into wchar_t rather than their\n        // bytes when we deal with a partially valid Unicode string.\n        let mut crab_vec = OsStr::new(\"🦀\").to_os_string().into_encoded_bytes();\n        crab_vec.push(0xD6_u8);\n        let crab = unsafe { OsString::from_encoded_bytes_unchecked(crab_vec) };\n        let crab_wchar: Vec<wchar_t> = vec![0x1F980, 0xD6];\n        assert!(matches!(osstring_to_string(crab), WcharString::Raw(v) if v == crab_wchar));\n    }\n}\n"
  },
  {
    "path": "src/macos.rs",
    "content": "use libc::c_int;\n\nuse crate::ffi;\nuse crate::{HidApi, HidDevice, HidResult};\n\nimpl HidApi {\n    /// Changes the behavior of all further calls that open a new [`HidDevice`]\n    /// like [`HidApi::open`] or [`HidApi::open_path`]. By default on Darwin\n    /// platform all devices opened by [`HidApi`] are opened in exclusive mode.\n    ///\n    /// When `exclusive` is set to:\n    ///   * `false` - all further devices will be opened in non-exclusive mode.\n    ///   * `true` all further devices will be opened in exclusive mode.\n    pub fn set_open_exclusive(&self, exclusive: bool) {\n        unsafe { ffi::macos::hid_darwin_set_open_exclusive(exclusive as c_int) }\n    }\n\n    /// Get the current opening behavior set by [`HidApi::set_open_exclusive`].\n    pub fn get_open_exclusive(&self) -> bool {\n        unsafe { ffi::macos::hid_darwin_get_open_exclusive() != 0 }\n    }\n}\n\nimpl HidDevice {\n    /// Get the location ID for a [`HidDevice`] device.\n    pub fn get_location_id(&self) -> HidResult<u32> {\n        self.inner.get_location_id()\n    }\n\n    /// Check if the device was opened in exclusive mode.\n    pub fn is_open_exclusive(&self) -> HidResult<bool> {\n        self.inner.is_open_exclusive()\n    }\n}\n"
  },
  {
    "path": "src/windows.rs",
    "content": "use crate::{HidDevice, HidResult};\npub use windows_sys::core::GUID;\n\nimpl HidDevice {\n    /// Get the container ID for a HID device.\n    ///\n    /// This function returns the `DEVPKEY_Device_ContainerId` property of the\n    /// given device. This can be used to correlate different interfaces/ports\n    /// on the same hardware device.\n    pub fn get_container_id(&self) -> HidResult<GUID> {\n        self.inner.get_container_id()\n    }\n}\n"
  },
  {
    "path": "src/windows_native/descriptor/encoder.rs",
    "content": "use crate::windows_native::descriptor::typedefs::{Caps, LinkCollectionNode};\nuse crate::windows_native::descriptor::types::{ItemNodeType, Items, MainItemNode, MainItems};\nuse crate::windows_native::error::{WinError, WinResult};\nuse crate::windows_native::utils::PeakIterExt;\n\npub fn encode_descriptor(\n    main_item_list: &[MainItemNode],\n    caps_list: &[Caps],\n    link_collection_nodes: &[LinkCollectionNode],\n) -> WinResult<Vec<u8>> {\n    // ***********************************\n    // Encode the report descriptor output\n    // ***********************************\n\n    let mut writer = DescriptorWriter::default();\n\n    let mut last_report_id = 0;\n    let mut last_usage_page = 0;\n    let mut last_physical_min = 0; // If both, Physical Minimum and Physical Maximum are 0, the logical limits should be taken as physical limits according USB HID spec 1.11 chapter 6.2.2.7\n    let mut last_physical_max = 0;\n    let mut last_unit_exponent = 0; // If Unit Exponent is Undefined it should be considered as 0 according USB HID spec 1.11 chapter 6.2.2.7\n    let mut last_unit = 0; // If the first nibble is 7, or second nibble of Unit is 0, the unit is None according USB HID spec 1.11 chapter 6.2.2.7\n    let mut inhibit_write_of_usage = false; // Needed in case of delimited usage print, before the normal collection or cap\n    let mut report_count = 0;\n\n    for (current, next) in main_item_list.iter().peaking() {\n        let rt_idx = current.main_item_type;\n        let caps_idx = current.caps_index;\n        match current.main_item_type {\n            MainItems::Collection => {\n                if last_usage_page\n                    != link_collection_nodes[current.collection_index].link_usage_page\n                {\n                    // Write \"Usage Page\" at the begin of a collection - except it refers the same table as wrote last\n                    last_usage_page =\n                        link_collection_nodes[current.collection_index].link_usage_page;\n                    writer.write(Items::GlobalUsagePage, last_usage_page)?;\n                }\n                if inhibit_write_of_usage {\n                    // Inhibit only once after DELIMITER statement\n                    inhibit_write_of_usage = false;\n                } else {\n                    // Write \"Usage\" of collection\n                    writer.write(\n                        Items::LocalUsage,\n                        link_collection_nodes[current.collection_index].link_usage,\n                    )?;\n                }\n                // Write begin of \"Collection\"\n                writer.write(\n                    Items::MainCollection,\n                    link_collection_nodes[current.collection_index].collection_type(),\n                )?;\n            }\n            MainItems::CollectionEnd => {\n                // Write \"End Collection\"\n                writer.write(Items::MainCollectionEnd, 0)?;\n            }\n            MainItems::DelimiterOpen => {\n                // Current.collection_index seems to always be != -1 -> removing branches compared to c\n                // Write \"Usage Page\" inside of a collection delmiter section\n                if last_usage_page\n                    != link_collection_nodes[current.collection_index].link_usage_page\n                {\n                    last_usage_page =\n                        link_collection_nodes[current.collection_index].link_usage_page;\n                    writer.write(\n                        Items::GlobalUsagePage,\n                        link_collection_nodes[current.collection_index].collection_type(),\n                    )?;\n                }\n                // Write \"Delimiter Open\"\n                writer.write(Items::LocalDelimiter, 1)?; // 1 = open set of aliased usages\n            }\n            MainItems::DelimiterUsage => {\n                // Current.collection_index seems to always be != -1 -> removing branches compared to c\n                // Write aliased collection \"Usage\"\n                writer.write(\n                    Items::LocalUsage,\n                    link_collection_nodes[current.collection_index].link_usage,\n                )?;\n            }\n            MainItems::DelimiterClose => {\n                // Write \"Delimiter Close\"\n                writer.write(Items::LocalDelimiter, 0)?; // 0 = close set of aliased usages\n                                                         // Inhibit next usage write\n                inhibit_write_of_usage = true;\n            }\n            _ if current.node_type == ItemNodeType::Padding => {\n                // Padding\n                // The preparsed data doesn't contain any information about padding. Therefore all undefined gaps\n                // in the reports are filled with the same style of constant padding.\n\n                // Write \"Report Size\" with number of padding bits\n                writer.write(\n                    Items::GlobalReportSize,\n                    current.last_bit - current.first_bit + 1,\n                )?;\n\n                // Write \"Report Count\" for padding always as 1\n                writer.write(Items::GlobalReportCount, 1)?;\n\n                if rt_idx == MainItems::Input {\n                    // Write \"Input\" main item - We know it's Constant - We can only guess the other bits, but they don't matter in case of const\n                    writer.write(Items::MainInput, 0x03)?; // Const / Abs\n                } else if rt_idx == MainItems::Output {\n                    // Write \"Output\" main item - We know it's Constant - We can only guess the other bits, but they don't matter in case of const\n                    writer.write(Items::MainOutput, 0x03)?; // Const / Abs\n                } else if rt_idx == MainItems::Feature {\n                    // Write \"Feature\" main item - We know it's Constant - We can only guess the other bits, but they don't matter in case of const\n                    writer.write(Items::MainFeature, 0x03)?; // Const / Abs\n                }\n                report_count = 0;\n            }\n            _ if caps_list[caps_idx as usize].is_button_cap() => {\n                let caps = caps_list[caps_idx as usize];\n                // Button\n                // (The preparsed data contain different data for 1 bit Button caps, than for parametric Value caps)\n\n                if last_report_id != caps.report_id {\n                    // Write \"Report ID\" if changed\n                    last_report_id = caps.report_id;\n                    writer.write(Items::GlobalReportId, last_report_id)?;\n                }\n\n                // Write \"Usage Page\" when changed\n                if caps.usage_page != last_usage_page {\n                    last_usage_page = caps.usage_page;\n                    writer.write(Items::GlobalUsagePage, last_usage_page)?;\n                }\n\n                // Write only local report items for each cap, if ReportCount > 1\n                if caps.is_range() {\n                    report_count += caps.range().data_index_max - caps.range().data_index_min;\n                }\n\n                if inhibit_write_of_usage {\n                    // Inhibit only once after Delimiter - Reset flag\n                    inhibit_write_of_usage = false;\n                } else if caps.is_range() {\n                    // Write range from \"Usage Minimum\" to \"Usage Maximum\"\n                    writer.write(Items::LocalUsageMinimum, caps.range().usage_min)?;\n                    writer.write(Items::LocalUsageMaximum, caps.range().usage_max)?;\n                } else {\n                    // Write single \"Usage\"\n                    writer.write(Items::LocalUsage, caps.not_range().usage)?;\n                }\n\n                if caps.is_designator_range() {\n                    // Write physical descriptor indices range from \"Designator Minimum\" to \"Designator Maximum\"\n                    writer.write(Items::LocalDesignatorMinimum, caps.range().designator_min)?;\n                    writer.write(Items::LocalDesignatorMaximum, caps.range().designator_max)?;\n                } else if caps.not_range().designator_index != 0 {\n                    // Designator set 0 is a special descriptor set (of the HID Physical Descriptor),\n                    // that specifies the number of additional descriptor sets.\n                    // Therefore Designator Index 0 can never be a useful reference for a control and we can inhibit it.\n                    // Write single \"Designator Index\"\n                    writer.write(\n                        Items::LocalDesignatorIndex,\n                        caps.not_range().designator_index,\n                    )?;\n                }\n\n                if caps.is_string_range() {\n                    // Write range of indices of the USB string descriptor, from \"String Minimum\" to \"String Maximum\"\n                    writer.write(Items::LocalStringMinimum, caps.range().string_min)?;\n                    writer.write(Items::LocalStringMaximum, caps.range().string_max)?;\n                } else if caps.not_range().string_index != 0 {\n                    // String Index 0 is a special entry of the USB string descriptor, that contains a list of supported languages,\n                    // therefore Designator Index 0 can never be a useful reference for a control and we can inhibit it.\n                    // Write single \"String Index\"\n                    writer.write(Items::LocalString, caps.not_range().string_index)?;\n                }\n\n                if next.is_some_and(|next| {\n                    next.main_item_type == rt_idx &&\n                        next.node_type == ItemNodeType::Cap &&\n                        !caps.is_range() && // This node in list is no array\n                        !caps_list[next.caps_index as usize].is_range() && // Next node in list is no array\n                        caps_list[next.caps_index as usize].is_button_cap() &&\n                        caps_list[next.caps_index as usize].usage_page == caps.usage_page &&\n                        caps_list[next.caps_index as usize].report_id == caps.report_id &&\n                        caps_list[next.caps_index as usize].bit_field == caps.bit_field\n                }) {\n                    if next.unwrap().first_bit != current.first_bit {\n                        // In case of IsMultipleItemsForArray for multiple dedicated usages for a multi-button array, the report count should be incremented\n\n                        // Skip global items until any of them changes, than use ReportCount item to write the count of identical report fields\n                        report_count += 1;\n                    }\n                } else {\n                    if caps.button().logical_min == 0 && caps.button().logical_max == 0 {\n                        // While a HID report descriptor must always contain LogicalMinimum and LogicalMaximum,\n                        // the preparsed data contain both fields set to zero, for the case of simple buttons\n                        // Write \"Logical Minimum\" set to 0 and \"Logical Maximum\" set to 1\n                        writer.write(Items::GlobalLogicalMinimum, 0)?;\n                        writer.write(Items::GlobalLogicalMaximum, 1)?;\n                    } else {\n                        // Write logical range from \"Logical Minimum\" to \"Logical Maximum\"\n                        writer.write(Items::GlobalLogicalMinimum, caps.button().logical_min)?;\n                        writer.write(Items::GlobalLogicalMaximum, caps.button().logical_max)?;\n                    }\n\n                    // Write \"Report Size\"\n                    writer.write(Items::GlobalReportSize, caps.report_size)?;\n\n                    // Write \"Report Count\"\n                    if !caps.is_range() {\n                        // Variable bit field with one bit per button\n                        // In case of multiple usages with the same items, only \"Usage\" is written per cap, and \"Report Count\" is incremented\n                        writer.write(Items::GlobalReportCount, caps.report_count + report_count)?;\n                    } else {\n                        // Button array of \"Report Size\" x \"Report Count\n                        writer.write(Items::GlobalReportCount, caps.report_count)?;\n                    }\n\n                    // Buttons have only 1 bit and therefore no physical limits/units -> Set to undefined state\n                    if last_physical_min != 0 {\n                        // Write \"Physical Minimum\", but only if changed\n                        last_physical_min = 0;\n                        writer.write(Items::GlobalPhysicalMinimum, last_physical_min)?;\n                    }\n                    if last_physical_max != 0 {\n                        // Write \"Physical Maximum\", but only if changed\n                        last_physical_max = 0;\n                        writer.write(Items::GlobalPhysicalMaximum, last_physical_max)?;\n                    }\n                    if last_unit_exponent != 0 {\n                        // Write \"Unit Exponent\", but only if changed\n                        last_unit_exponent = 0;\n                        writer.write(Items::GlobalUnitExponent, last_unit_exponent)?;\n                    }\n                    if last_unit != 0 {\n                        // Write \"Unit\",but only if changed\n                        last_unit = 0;\n                        writer.write(Items::GlobalUnit, last_unit)?;\n                    }\n\n                    // Write \"Input\" main item\n                    if rt_idx == MainItems::Input {\n                        writer.write(Items::MainInput, caps.bit_field)?;\n                    }\n                    // Write \"Output\" main item\n                    else if rt_idx == MainItems::Output {\n                        writer.write(Items::MainOutput, caps.bit_field)?;\n                    }\n                    // Write \"Feature\" main item\n                    else if rt_idx == MainItems::Feature {\n                        writer.write(Items::MainFeature, caps.bit_field)?;\n                    }\n                    report_count = 0;\n                }\n            }\n            _ => {\n                let mut caps = caps_list[caps_idx as usize];\n\n                if last_report_id != caps.report_id {\n                    // Write \"Report ID\" if changed\n                    last_report_id = caps.report_id;\n                    writer.write(Items::GlobalReportId, last_report_id)?;\n                }\n\n                // Write \"Usage Page\" if changed\n                if caps.usage_page != last_usage_page {\n                    last_usage_page = caps.usage_page;\n                    writer.write(Items::GlobalUsagePage, last_usage_page)?;\n                }\n\n                if inhibit_write_of_usage {\n                    // Inhibit only once after Delimiter - Reset flag\n                    inhibit_write_of_usage = false;\n                } else if caps.is_range() {\n                    // Write usage range from \"Usage Minimum\" to \"Usage Maximum\"\n                    writer.write(Items::LocalUsageMinimum, caps.range().usage_min)?;\n                    writer.write(Items::LocalUsageMaximum, caps.range().usage_max)?;\n                } else {\n                    // Write single \"Usage\"\n                    writer.write(Items::LocalUsage, caps.not_range().usage)?;\n                }\n\n                if caps.is_designator_range() {\n                    // Write physical descriptor indices range from \"Designator Minimum\" to \"Designator Maximum\"\n                    writer.write(Items::LocalDesignatorMinimum, caps.range().designator_min)?;\n                    writer.write(Items::LocalDesignatorMaximum, caps.range().designator_max)?;\n                } else if caps.not_range().designator_index != 0 {\n                    // Designator set 0 is a special descriptor set (of the HID Physical Descriptor),\n                    // that specifies the number of additional descriptor sets.\n                    // Therefore Designator Index 0 can never be a useful reference for a control and we can inhibit it.\n                    // Write single \"Designator Index\"\n                    writer.write(\n                        Items::LocalDesignatorIndex,\n                        caps.not_range().designator_index,\n                    )?;\n                }\n\n                if caps.is_string_range() {\n                    // Write range of indices of the USB string descriptor, from \"String Minimum\" to \"String Maximum\"\n                    writer.write(Items::LocalStringMinimum, caps.range().string_min)?;\n                    writer.write(Items::LocalStringMaximum, caps.range().string_max)?;\n                } else if caps.not_range().string_index != 0 {\n                    // String Index 0 is a special entry of the USB string descriptor, that contains a list of supported languages,\n                    // therefore Designator Index 0 can never be a useful reference for a control and we can inhibit it.\n                    // Write single \"String Index\"\n                    writer.write(Items::LocalString, caps.not_range().string_index)?;\n                }\n\n                if (caps.bit_field & 0x02) != 0x02 {\n                    // In case of an value array overwrite \"Report Count\"\n                    caps.report_count =\n                        caps.range().data_index_max - caps.range().data_index_min + 1;\n                }\n\n                #[allow(clippy::blocks_in_if_conditions)]\n                if next.is_some_and(|next| {\n                    let next_caps = caps_list\n                        .get(next.caps_index as usize)\n                        .copied()\n                        .unwrap_or_else(|| unsafe { std::mem::zeroed() });\n                    next.main_item_type == rt_idx\n                        && next.node_type == ItemNodeType::Cap\n                        && !next_caps.is_button_cap()\n                        && !caps.is_range()\n                        && !next_caps.is_range()\n                        && next_caps.usage_page == caps.usage_page\n                        && next_caps.not_button().logical_min == caps.not_button().logical_min\n                        && next_caps.not_button().logical_max == caps.not_button().logical_max\n                        && next_caps.not_button().physical_min == caps.not_button().physical_min\n                        && next_caps.not_button().physical_max == caps.not_button().physical_max\n                        && next_caps.units_exp == caps.units_exp\n                        && next_caps.units == caps.units\n                        && next_caps.report_size == caps.report_size\n                        && next_caps.report_id == caps.report_id\n                        && next_caps.bit_field == caps.bit_field\n                        && next_caps.report_count == 1\n                        && caps.report_count == 1\n                }) {\n                    // Skip global items until any of them changes, than use ReportCount item to write the count of identical report fields\n                    report_count += 1;\n                } else {\n                    // Value\n\n                    // Write logical range from \"Logical Minimum\" to \"Logical Maximum\"\n                    writer.write(Items::GlobalLogicalMinimum, caps.not_button().logical_min)?;\n                    writer.write(Items::GlobalLogicalMaximum, caps.not_button().logical_max)?;\n\n                    if (last_physical_min != caps.not_button().physical_min)\n                        || (last_physical_max != caps.not_button().physical_max)\n                    {\n                        // Write range from \"Physical Minimum\" to \" Physical Maximum\", but only if one of them changed\n                        last_physical_min = caps.not_button().physical_min;\n                        last_physical_max = caps.not_button().physical_max;\n                        writer.write(Items::GlobalPhysicalMinimum, last_physical_min)?;\n                        writer.write(Items::GlobalPhysicalMaximum, last_physical_max)?;\n                    }\n\n                    if last_unit_exponent != caps.units_exp {\n                        // Write \"Unit Exponent\", but only if changed\n                        last_unit_exponent = caps.units_exp;\n                        writer.write(Items::GlobalUnitExponent, last_unit_exponent)?;\n                    }\n\n                    if last_unit != caps.units {\n                        // Write physical \"Unit\", but only if changed\n                        last_unit = caps.units;\n                        writer.write(Items::GlobalUnit, last_unit)?;\n                    }\n\n                    // Write \"Report Size\"\n                    writer.write(Items::GlobalReportSize, caps.report_size)?;\n\n                    // Write \"Report Count\"\n                    writer.write(Items::GlobalReportCount, caps.report_count + report_count)?;\n\n                    if rt_idx == MainItems::Input {\n                        // Write \"Input\" main item\n                        writer.write(Items::MainInput, caps.bit_field)?;\n                    } else if rt_idx == MainItems::Output {\n                        // Write \"Output\" main item\n                        writer.write(Items::MainOutput, caps.bit_field)?;\n                    } else if rt_idx == MainItems::Feature {\n                        // Write \"Feature\" main item\n                        writer.write(Items::MainFeature, caps.bit_field)?;\n                    }\n                    report_count = 0;\n                }\n            }\n        }\n    }\n\n    Ok(writer.finish())\n}\n\n#[derive(Default)]\nstruct DescriptorWriter(Vec<u8>);\n\nimpl DescriptorWriter {\n    // Writes a short report descriptor item according USB HID spec 1.11 chapter 6.2.2.2\n    fn write(&mut self, item: Items, data: impl Into<i64>) -> WinResult<()> {\n        let data = data.into();\n        match item {\n            Items::MainCollectionEnd => {\n                self.0.push(item as u8);\n            }\n            Items::GlobalLogicalMinimum\n            | Items::GlobalLogicalMaximum\n            | Items::GlobalPhysicalMinimum\n            | Items::GlobalPhysicalMaximum => {\n                if let Ok(data) = i8::try_from(data) {\n                    self.0.push((item as u8) + 0x01);\n                    self.0.extend(data.to_le_bytes())\n                } else if let Ok(data) = i16::try_from(data) {\n                    self.0.push((item as u8) + 0x02);\n                    self.0.extend(data.to_le_bytes())\n                } else if let Ok(data) = i32::try_from(data) {\n                    self.0.push((item as u8) + 0x03);\n                    self.0.extend(data.to_le_bytes())\n                } else {\n                    return Err(WinError::InvalidPreparsedData);\n                }\n            }\n            _ => {\n                if let Ok(data) = u8::try_from(data) {\n                    self.0.push((item as u8) + 0x01);\n                    self.0.extend(data.to_le_bytes())\n                } else if let Ok(data) = u16::try_from(data) {\n                    self.0.push((item as u8) + 0x02);\n                    self.0.extend(data.to_le_bytes())\n                } else if let Ok(data) = u32::try_from(data) {\n                    self.0.push((item as u8) + 0x03);\n                    self.0.extend(data.to_le_bytes())\n                } else {\n                    return Err(WinError::InvalidPreparsedData);\n                }\n            }\n        }\n        Ok(())\n    }\n\n    fn finish(self) -> Vec<u8> {\n        self.0\n    }\n}\n"
  },
  {
    "path": "src/windows_native/descriptor/mod.rs",
    "content": "mod encoder;\n#[cfg(test)]\nmod tests;\nmod typedefs;\nmod types;\n\nuse crate::windows_native::descriptor::encoder::encode_descriptor;\nuse crate::windows_native::descriptor::typedefs::{Caps, HidpPreparsedData, LinkCollectionNode};\nuse crate::windows_native::descriptor::types::{\n    BitRange, ItemNodeType, MainItemNode, MainItems, ReportType,\n};\nuse crate::windows_native::error::{WinError, WinResult};\nuse crate::windows_native::hid::PreparsedData;\nuse crate::windows_native::utils::PeakIterExt;\nuse std::collections::HashMap;\nuse std::ffi::c_void;\nuse std::slice;\n\npub fn get_descriptor(pp_data: &PreparsedData) -> WinResult<Vec<u8>> {\n    unsafe { get_descriptor_ptr(pp_data.as_ptr()) }\n}\n\nunsafe fn get_descriptor_ptr(pp_data: *const c_void) -> WinResult<Vec<u8>> {\n    let (header, caps_list, link_collection_nodes) = extract_structures(pp_data)?;\n\n    let list = reconstruct_descriptor(header, caps_list, link_collection_nodes);\n\n    encode_descriptor(&list, caps_list, link_collection_nodes)\n}\n\nunsafe fn extract_structures<'a>(\n    pp_data: *const c_void,\n) -> WinResult<(HidpPreparsedData, &'a [Caps], &'a [LinkCollectionNode])> {\n    let header: *const HidpPreparsedData = pp_data as _;\n\n    // Check if MagicKey is correct, to ensure that pp_data points to an valid preparse data structure\n    ensure!(\n        &(*header).magic_key == b\"HidP KDR\",\n        Err(WinError::InvalidPreparsedData)\n    );\n\n    let caps_ptr: *const Caps = header.offset(1) as _;\n    let caps_len = ReportType::values()\n        .into_iter()\n        .map(|r| (*header).caps_info[r as usize].last_cap)\n        .max()\n        .unwrap() as usize;\n\n    let link_ptr: *const LinkCollectionNode = ((caps_ptr as *const c_void)\n        .offset((*header).first_byte_of_link_collection_array as isize))\n        as _;\n    let link_len = (*header).number_link_collection_nodes as usize;\n\n    Ok((\n        *header,\n        slice::from_raw_parts(caps_ptr, caps_len),\n        slice::from_raw_parts(link_ptr, link_len),\n    ))\n}\n\nfn reconstruct_descriptor(\n    header: HidpPreparsedData,\n    caps_list: &[Caps],\n    link_collection_nodes: &[LinkCollectionNode],\n) -> Vec<MainItemNode> {\n    // ****************************************************************************************************************************\n    // Create lookup tables for the bit range of each report per collection (position of first bit and last bit in each collection)\n    // coll_bit_range[COLLECTION_INDEX][REPORT_ID][INPUT/OUTPUT/FEATURE]\n    // ****************************************************************************************************************************\n    let mut coll_bit_range: HashMap<(usize, u8, ReportType), BitRange> = HashMap::new();\n    for rt_idx in ReportType::values() {\n        let caps_info = header.caps_info[rt_idx as usize];\n        for caps_idx in caps_info.first_cap..caps_info.last_cap {\n            let caps = caps_list[caps_idx as usize];\n            let range = caps.get_bit_range();\n            coll_bit_range\n                .entry((caps.link_collection as usize, caps.report_id, rt_idx))\n                .and_modify(|r| *r = r.merge(range))\n                .or_insert(range);\n        }\n    }\n\n    // *************************************************************************\n    // -Determine hierachy levels of each collections and store it in:\n    //  coll_levels[COLLECTION_INDEX]\n    // -Determine number of direct childs of each collections and store it in:\n    //  coll_number_of_direct_childs[COLLECTION_INDEX]\n    // *************************************************************************\n    let mut max_coll_level = 0;\n    let mut coll_levels = vec![-1; link_collection_nodes.len()];\n    let mut coll_number_of_direct_childs = vec![0; link_collection_nodes.len()];\n    {\n        let mut actual_coll_level = 0;\n        let mut collection_node_idx = 0;\n        while actual_coll_level >= 0 {\n            coll_levels[collection_node_idx] = actual_coll_level;\n            let node = link_collection_nodes[collection_node_idx];\n            if node.number_of_children > 0 && coll_levels[node.first_child as usize] == -1 {\n                actual_coll_level += 1;\n                coll_levels[collection_node_idx] = actual_coll_level;\n                max_coll_level = max_coll_level.max(actual_coll_level);\n                coll_number_of_direct_childs[collection_node_idx] += 1;\n                collection_node_idx = node.first_child as usize;\n            } else if node.next_sibling != 0 {\n                coll_number_of_direct_childs[node.parent as usize] += 1;\n                collection_node_idx = node.next_sibling as usize;\n            } else {\n                actual_coll_level -= 1;\n                if actual_coll_level >= 0 {\n                    collection_node_idx = node.parent as usize;\n                }\n            }\n        }\n    }\n\n    // *********************************************************************************\n    // Propagate the bit range of each report from the child collections to their parent\n    // and store the merged result for the parent\n    // *********************************************************************************\n    for actual_coll_level in (0..max_coll_level).rev() {\n        for collection_node_idx in 0..link_collection_nodes.len() {\n            if coll_levels[collection_node_idx] == actual_coll_level {\n                let mut child_idx = link_collection_nodes[collection_node_idx].first_child as usize;\n                while child_idx != 0 {\n                    for reportid_idx in 0..=255 {\n                        for rt_idx in ReportType::values() {\n                            if let Some(child) = coll_bit_range\n                                .get(&(child_idx, reportid_idx, rt_idx))\n                                .copied()\n                            {\n                                coll_bit_range\n                                    .entry((collection_node_idx, reportid_idx, rt_idx))\n                                    .and_modify(|r| *r = r.merge(child))\n                                    .or_insert(child);\n                            }\n                            child_idx = link_collection_nodes[child_idx].next_sibling as usize;\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    // *************************************************************************************************\n    // Determine child collection order of the whole hierachy, based on previously determined bit ranges\n    // and store it this index coll_child_order[COLLECTION_INDEX][DIRECT_CHILD_INDEX]\n    // *************************************************************************************************\n    let mut coll_child_order: HashMap<(usize, u16), usize> = HashMap::new();\n    {\n        let mut coll_parsed_flag = vec![false; link_collection_nodes.len()];\n        let mut actual_coll_level = 0;\n        let mut collection_node_idx = 0;\n        while actual_coll_level >= 0 {\n            if coll_number_of_direct_childs[collection_node_idx] != 0\n                && !coll_parsed_flag\n                    [link_collection_nodes[collection_node_idx].first_child as usize]\n            {\n                coll_parsed_flag[link_collection_nodes[collection_node_idx].first_child as usize] =\n                    true;\n\n                {\n                    // Create list of child collection indices\n                    // sorted reverse to the order returned to HidP_GetLinkCollectionNodeschild\n                    // which seems to match teh original order, as long as no bit position needs to be considered\n                    let mut child_idx =\n                        link_collection_nodes[collection_node_idx].first_child as usize;\n                    let mut child_count = coll_number_of_direct_childs[collection_node_idx] - 1;\n                    coll_child_order.insert((collection_node_idx, child_count), child_idx);\n                    while link_collection_nodes[child_idx].next_sibling != 0 {\n                        child_count -= 1;\n                        child_idx = link_collection_nodes[child_idx].next_sibling as usize;\n                        coll_child_order.insert((collection_node_idx, child_count), child_idx);\n                    }\n                }\n\n                if coll_number_of_direct_childs[collection_node_idx] > 1 {\n                    // Sort child collections indices by bit positions\n                    for rt_idx in ReportType::values() {\n                        for report_idx in 0..=255 {\n                            for child_idx in 1..coll_number_of_direct_childs[collection_node_idx] {\n                                // since the coll_bit_range array is not sorted, we need to reference the collection index in\n                                // our sorted coll_child_order array, and look up the corresponding bit ranges for comparing values to sort\n                                let prev_coll_idx = *coll_child_order\n                                    .get(&(collection_node_idx, child_idx - 1))\n                                    .unwrap();\n                                let cur_coll_idx = *coll_child_order\n                                    .get(&(collection_node_idx, child_idx))\n                                    .unwrap();\n                                let swap = coll_bit_range\n                                    .get(&(prev_coll_idx, report_idx, rt_idx))\n                                    .map(|prev| prev.first_bit)\n                                    .zip(\n                                        coll_bit_range\n                                            .get(&(cur_coll_idx, report_idx, rt_idx))\n                                            .map(|prev| prev.first_bit),\n                                    )\n                                    .map_or(false, |(prev, cur)| prev > cur);\n                                if swap {\n                                    coll_child_order.insert(\n                                        (collection_node_idx, (child_idx - 1)),\n                                        cur_coll_idx,\n                                    );\n                                    coll_child_order\n                                        .insert((collection_node_idx, child_idx), prev_coll_idx);\n                                }\n                            }\n                        }\n                    }\n                }\n                actual_coll_level += 1;\n                collection_node_idx =\n                    link_collection_nodes[collection_node_idx].first_child as usize;\n            } else if link_collection_nodes[collection_node_idx].next_sibling != 0 {\n                collection_node_idx =\n                    link_collection_nodes[collection_node_idx].next_sibling as usize;\n            } else {\n                actual_coll_level -= 1;\n                if actual_coll_level >= 0 {\n                    collection_node_idx =\n                        link_collection_nodes[collection_node_idx].parent as usize;\n                }\n            }\n        }\n    }\n\n    // ***************************************************************************************\n    // Create sorted main_item_list containing all the Collection and CollectionEnd main items\n    // ***************************************************************************************\n    let mut main_item_list: Vec<MainItemNode> = Vec::new();\n    {\n        let mut coll_last_written_child = vec![-1i32; link_collection_nodes.len()];\n\n        let mut actual_coll_level = 0;\n        let mut collection_node_idx = 0;\n        let mut first_delimiter_node = false;\n\n        main_item_list.push(MainItemNode::new(\n            0,\n            0,\n            ItemNodeType::Collection,\n            0,\n            collection_node_idx,\n            MainItems::Collection,\n            0,\n        ));\n        while actual_coll_level >= 0 {\n            if coll_number_of_direct_childs[collection_node_idx] != 0\n                && coll_last_written_child[collection_node_idx] == -1\n            {\n                // Collection has child collections, but none is written to the list yet\n                coll_last_written_child[collection_node_idx] =\n                    coll_child_order[&(collection_node_idx, 0)] as i32;\n                collection_node_idx = coll_child_order[&(collection_node_idx, 0)];\n\n                // In a HID Report Descriptor, the first usage declared is the most preferred usage for the control.\n                // While the order in the WIN32 capabiliy strutures is the opposite:\n                // Here the preferred usage is the last aliased usage in the sequence.\n                if link_collection_nodes[collection_node_idx].is_alias() && !first_delimiter_node {\n                    first_delimiter_node = true;\n                    main_item_list.push(MainItemNode::new(\n                        0,\n                        0,\n                        ItemNodeType::Collection,\n                        0,\n                        collection_node_idx,\n                        MainItems::DelimiterUsage,\n                        0,\n                    ));\n                    main_item_list.push(MainItemNode::new(\n                        0,\n                        0,\n                        ItemNodeType::Collection,\n                        0,\n                        collection_node_idx,\n                        MainItems::DelimiterClose,\n                        0,\n                    ));\n                } else {\n                    main_item_list.push(MainItemNode::new(\n                        0,\n                        0,\n                        ItemNodeType::Collection,\n                        0,\n                        collection_node_idx,\n                        MainItems::Collection,\n                        0,\n                    ));\n                    actual_coll_level += 1;\n                }\n            } else if coll_number_of_direct_childs[collection_node_idx] > 1\n                && coll_last_written_child[collection_node_idx]\n                    != coll_child_order[&(\n                        collection_node_idx,\n                        coll_number_of_direct_childs[collection_node_idx] - 1,\n                    )] as i32\n            {\n                // Collection has child collections, and this is not the first child\n                let mut next_child = 1;\n                while coll_last_written_child[collection_node_idx]\n                    != coll_child_order[&(collection_node_idx, (next_child - 1))] as i32\n                {\n                    next_child += 1;\n                }\n                coll_last_written_child[collection_node_idx] =\n                    coll_child_order[&(collection_node_idx, next_child)] as i32;\n                collection_node_idx = coll_child_order[&(collection_node_idx, next_child)];\n\n                if link_collection_nodes[collection_node_idx].is_alias() && !first_delimiter_node {\n                    // Alliased Collection (First node in link_collection_nodes -> Last entry in report descriptor output)\n                    first_delimiter_node = true;\n                    main_item_list.push(MainItemNode::new(\n                        0,\n                        0,\n                        ItemNodeType::Collection,\n                        0,\n                        collection_node_idx,\n                        MainItems::DelimiterUsage,\n                        0,\n                    ));\n                    main_item_list.push(MainItemNode::new(\n                        0,\n                        0,\n                        ItemNodeType::Collection,\n                        0,\n                        collection_node_idx,\n                        MainItems::DelimiterClose,\n                        0,\n                    ));\n                } else if link_collection_nodes[collection_node_idx].is_alias()\n                    && first_delimiter_node\n                {\n                    main_item_list.insert(\n                        1,\n                        MainItemNode::new(\n                            0,\n                            0,\n                            ItemNodeType::Collection,\n                            0,\n                            collection_node_idx,\n                            MainItems::DelimiterUsage,\n                            0,\n                        ),\n                    );\n                } else if !link_collection_nodes[collection_node_idx].is_alias()\n                    && first_delimiter_node\n                {\n                    main_item_list.insert(\n                        1,\n                        MainItemNode::new(\n                            0,\n                            0,\n                            ItemNodeType::Collection,\n                            0,\n                            collection_node_idx,\n                            MainItems::DelimiterUsage,\n                            0,\n                        ),\n                    );\n                    main_item_list.insert(\n                        1,\n                        MainItemNode::new(\n                            0,\n                            0,\n                            ItemNodeType::Collection,\n                            0,\n                            collection_node_idx,\n                            MainItems::DelimiterClose,\n                            0,\n                        ),\n                    );\n                    first_delimiter_node = false;\n                }\n                if !link_collection_nodes[collection_node_idx].is_alias() {\n                    main_item_list.push(MainItemNode::new(\n                        0,\n                        0,\n                        ItemNodeType::Collection,\n                        0,\n                        collection_node_idx,\n                        MainItems::Collection,\n                        0,\n                    ));\n                    actual_coll_level += 1;\n                }\n            } else {\n                actual_coll_level -= 1;\n                main_item_list.push(MainItemNode::new(\n                    0,\n                    0,\n                    ItemNodeType::Collection,\n                    0,\n                    collection_node_idx,\n                    MainItems::CollectionEnd,\n                    0,\n                ));\n                collection_node_idx = link_collection_nodes[collection_node_idx].parent as usize;\n            }\n        }\n    }\n\n    // ****************************************************************\n    // Inserted Input/Output/Feature main items into the main_item_list\n    // in order of reconstructed bit positions\n    // ****************************************************************\n    for rt_idx in ReportType::values() {\n        // Add all value caps to node list\n        let mut first_delimiter_node = false;\n        let caps_info = header.caps_info[rt_idx as usize];\n        for caps_idx in caps_info.first_cap..caps_info.last_cap {\n            let caps = caps_list[caps_idx as usize];\n            let mut coll_begin = main_item_list\n                .iter()\n                .position(|node| node.collection_index == caps.link_collection as usize)\n                .unwrap();\n            let (first_bit, last_bit) = {\n                let range = caps.get_bit_range();\n                (range.first_bit, range.last_bit)\n            };\n\n            for child_idx in 0..coll_number_of_direct_childs[caps.link_collection as usize] {\n                // Determine in which section before/between/after child collection the item should be inserted\n                let child_first_bit = coll_child_order\n                    .get(&(caps.link_collection as usize, child_idx))\n                    .and_then(|i| coll_bit_range.get(&(*i, caps.report_id, rt_idx)))\n                    .map(|r| r.first_bit)\n                    .unwrap_or(0);\n                if first_bit < child_first_bit {\n                    // Note, that the default value for undefined coll_bit_range is -1, which can't be greater than the bit position\n                    break;\n                }\n                let index = coll_child_order[&(caps.link_collection as usize, child_idx)];\n                coll_begin = main_item_list\n                    .iter()\n                    .rposition(|node| node.collection_index == index)\n                    .unwrap();\n            }\n            let list_node = 1 + search_list(\n                first_bit as i32,\n                rt_idx.into(),\n                caps.report_id,\n                coll_begin,\n                &main_item_list,\n            );\n\n            // In a HID Report Descriptor, the first usage declared is the most preferred usage for the control.\n            // While the order in the WIN32 capabiliy strutures is the opposite:\n            // Here the preferred usage is the last aliased usage in the sequence.\n\n            if caps.is_alias() && !first_delimiter_node {\n                // Alliased Usage (First node in pp_data->caps -> Last entry in report descriptor output)\n                first_delimiter_node = true;\n                main_item_list.insert(\n                    list_node,\n                    MainItemNode::new(\n                        first_bit,\n                        last_bit,\n                        ItemNodeType::Cap,\n                        caps_idx as i32,\n                        caps.link_collection as usize,\n                        MainItems::DelimiterUsage,\n                        caps.report_id,\n                    ),\n                );\n                main_item_list.insert(\n                    list_node,\n                    MainItemNode::new(\n                        first_bit,\n                        last_bit,\n                        ItemNodeType::Cap,\n                        caps_idx as i32,\n                        caps.link_collection as usize,\n                        MainItems::DelimiterClose,\n                        caps.report_id,\n                    ),\n                );\n            } else if caps.is_alias() && first_delimiter_node {\n                main_item_list.insert(\n                    list_node,\n                    MainItemNode::new(\n                        first_bit,\n                        last_bit,\n                        ItemNodeType::Cap,\n                        caps_idx as i32,\n                        caps.link_collection as usize,\n                        MainItems::DelimiterUsage,\n                        caps.report_id,\n                    ),\n                );\n            } else if !caps.is_alias() && first_delimiter_node {\n                // Alliased Collection (Last node in pp_data->caps -> First entry in report descriptor output)\n                main_item_list.insert(\n                    list_node,\n                    MainItemNode::new(\n                        first_bit,\n                        last_bit,\n                        ItemNodeType::Cap,\n                        caps_idx as i32,\n                        caps.link_collection as usize,\n                        MainItems::DelimiterUsage,\n                        caps.report_id,\n                    ),\n                );\n                main_item_list.insert(\n                    list_node,\n                    MainItemNode::new(\n                        first_bit,\n                        last_bit,\n                        ItemNodeType::Cap,\n                        caps_idx as i32,\n                        caps.link_collection as usize,\n                        MainItems::DelimiterOpen,\n                        caps.report_id,\n                    ),\n                );\n                first_delimiter_node = false;\n            }\n            if !caps.is_alias() {\n                main_item_list.insert(\n                    list_node,\n                    MainItemNode::new(\n                        first_bit,\n                        last_bit,\n                        ItemNodeType::Cap,\n                        caps_idx as i32,\n                        caps.link_collection as usize,\n                        rt_idx.into(),\n                        caps.report_id,\n                    ),\n                );\n            }\n        }\n    }\n\n    // ***********************************************************\n    // Add const main items for padding to main_item_list\n    // -To fill all bit gaps\n    // -At each report end for 8bit padding\n    //  Note that information about the padding at the report end,\n    //  is not stored in the preparsed data, but in practice all\n    //  report descriptors seem to have it, as assumed here.\n    // ***********************************************************\n    {\n        let mut last_bit_position: HashMap<(MainItems, u8), i32> = HashMap::new();\n        let mut last_report_item_lookup: HashMap<(MainItems, u8), usize> = HashMap::new();\n\n        let mut index = 0;\n        while index < main_item_list.len() {\n            let current = main_item_list[index];\n            if ReportType::try_from(current.main_item_type).is_ok() {\n                let lbp = last_bit_position\n                    .get(&(current.main_item_type, current.report_id))\n                    .copied()\n                    .unwrap_or(-1);\n                let lrip = last_report_item_lookup\n                    .get(&(current.main_item_type, current.report_id))\n                    .copied();\n                if lbp + 1 != current.first_bit as i32\n                    && lrip.is_some_and(|i| main_item_list[i].first_bit != current.first_bit)\n                {\n                    let list_node = search_list(\n                        lbp,\n                        current.main_item_type,\n                        current.report_id,\n                        lrip.unwrap(),\n                        &main_item_list,\n                    );\n                    main_item_list.insert(\n                        list_node + 1,\n                        MainItemNode::new(\n                            (lbp + 1) as u16,\n                            current.first_bit - 1,\n                            ItemNodeType::Padding,\n                            -1,\n                            0,\n                            current.main_item_type,\n                            current.report_id,\n                        ),\n                    );\n                    index += 1;\n                }\n                last_bit_position.insert(\n                    (current.main_item_type, current.report_id),\n                    current.last_bit as i32,\n                );\n                last_report_item_lookup.insert((current.main_item_type, current.report_id), index);\n            }\n            index += 1;\n        }\n\n        for rt_idx in ReportType::values() {\n            for report_idx in 0..=255 {\n                if let Some(lbp) = last_bit_position.get(&(rt_idx.into(), report_idx)) {\n                    let padding = 8 - ((*lbp + 1) % 8);\n                    if padding < 8 {\n                        // Insert padding item after item referenced in last_report_item_lookup\n                        let lrip = *last_report_item_lookup\n                            .get(&(rt_idx.into(), report_idx))\n                            .unwrap();\n                        main_item_list.insert(\n                            lrip + 1,\n                            MainItemNode::new(\n                                (lbp + 1) as u16,\n                                (lbp + padding) as u16,\n                                ItemNodeType::Padding,\n                                -1,\n                                0,\n                                rt_idx.into(),\n                                report_idx,\n                            ),\n                        );\n                        last_report_item_lookup\n                            .values_mut()\n                            .filter(|i| **i > lrip)\n                            .for_each(|i| *i += 1);\n                    }\n                }\n            }\n        }\n    }\n    main_item_list\n}\n\nfn search_list(\n    search_bit: i32,\n    main_item_type: MainItems,\n    report_id: u8,\n    start: usize,\n    list: &[MainItemNode],\n) -> usize {\n    list[start..]\n        .iter()\n        .peaking()\n        .position(|(_, next)| {\n            next.is_some_and(|next| {\n                next.main_item_type == MainItems::Collection\n                    || next.main_item_type == MainItems::CollectionEnd\n                    || (next.last_bit as i32 >= search_bit\n                        && next.report_id == report_id\n                        && next.main_item_type == main_item_type)\n            })\n        })\n        .unwrap()\n        + start\n}\n"
  },
  {
    "path": "src/windows_native/descriptor/tests.rs",
    "content": "use crate::windows_native::descriptor::get_descriptor_ptr;\nuse std::fs::read_to_string;\n\n#[test]\nfn test_01() {\n    execute_testcase(\"045E_02FF_0005_0001\");\n}\n#[test]\nfn test_02() {\n    execute_testcase(\"046A_0011_0006_0001\");\n}\n#[test]\nfn test_03() {\n    execute_testcase(\"046D_0A37_0001_000C\");\n}\n#[test]\nfn test_04() {\n    execute_testcase(\"046D_B010_0001_000C\");\n}\n#[test]\nfn test_05() {\n    execute_testcase(\"046D_B010_0001_FF00\");\n}\n#[test]\nfn test_06() {\n    execute_testcase(\"046D_B010_0002_0001\");\n}\n#[test]\nfn test_07() {\n    execute_testcase(\"046D_B010_0002_FF00\");\n}\n#[test]\nfn test_08() {\n    execute_testcase(\"046D_B010_0006_0001\");\n}\n#[test]\nfn test_09() {\n    execute_testcase(\"046D_C077_0002_0001\");\n}\n#[test]\nfn test_10() {\n    execute_testcase(\"046D_C283_0004_0001\");\n}\n#[test]\nfn test_11() {\n    execute_testcase(\"046D_C52F_0001_000C\");\n}\n#[test]\nfn test_12() {\n    execute_testcase(\"046D_C52F_0001_FF00\");\n}\n#[test]\nfn test_13() {\n    execute_testcase(\"046D_C52F_0002_0001\");\n}\n#[test]\nfn test_14() {\n    execute_testcase(\"046D_C52F_0002_FF00\");\n}\n#[test]\nfn test_15() {\n    execute_testcase(\"046D_C534_0001_000C\");\n}\n#[test]\nfn test_16() {\n    execute_testcase(\"046D_C534_0001_FF00\");\n}\n#[test]\nfn test_17() {\n    execute_testcase(\"046D_C534_0002_0001\");\n}\n#[test]\nfn test_18() {\n    execute_testcase(\"046D_C534_0002_FF00\");\n}\n#[test]\nfn test_19() {\n    execute_testcase(\"046D_C534_0006_0001\");\n}\n#[test]\nfn test_20() {\n    execute_testcase(\"046D_C534_0080_0001\");\n}\n#[test]\nfn test_21() {\n    execute_testcase(\"047F_C056_0001_000C\");\n}\n#[test]\nfn test_22() {\n    execute_testcase(\"047F_C056_0003_FFA0\");\n}\n#[test]\nfn test_23() {\n    execute_testcase(\"047F_C056_0005_000B\");\n}\n#[test]\nfn test_24() {\n    execute_testcase(\"17CC_1130_0000_FF01\");\n}\n\nfn execute_testcase(filename: &str) {\n    let source_path = format!(\"./tests/pp_data/{filename}.pp_data\");\n    let expected_path = format!(\"./tests/pp_data/{filename}.expected\");\n    println!(\"Testing: {:?} <-> {:?}\", source_path, expected_path);\n    let pp_data = decode_hex(&read_to_string(&source_path).unwrap());\n    let expected_descriptor = decode_hex(&read_to_string(&expected_path).unwrap());\n    let constructed_descriptor = unsafe { get_descriptor_ptr(pp_data.as_ptr() as _) }.unwrap();\n    assert_eq!(constructed_descriptor, expected_descriptor);\n}\n\nfn decode_hex(hex: &str) -> Vec<u8> {\n    hex.lines()\n        .flat_map(|line| {\n            line.split(',')\n                .map(|hex| hex.trim())\n                .filter(|hex| !hex.is_empty())\n                .map(|hex| hex.strip_prefix(\"0x\").unwrap())\n                .map(|hex| u8::from_str_radix(hex, 16).unwrap())\n        })\n        .collect()\n}\n"
  },
  {
    "path": "src/windows_native/descriptor/typedefs.rs",
    "content": "use crate::windows_native::descriptor::types::BitRange;\nuse std::mem::size_of;\n\n// Reverse engineered typedefs for the internal structure of the preparsed data taken from\n// https://github.com/libusb/hidapi/blob/master/windows/hidapi_descriptor_reconstruct.h\n// https://github.com/libusb/hidapi/pull/306\n\n#[macro_export]\nmacro_rules! const_assert {\n    ($x:expr $(,)?) => {\n        #[allow(unknown_lints)]\n        const _: [(); 0 - !{\n            const ASSERT: bool = $x;\n            ASSERT\n        } as usize] = [];\n    };\n}\n\npub type Usage = u16;\n\nconst_assert!(size_of::<LinkCollectionNode>() == 16);\n#[derive(Copy, Clone)]\n#[repr(C)]\npub struct LinkCollectionNode {\n    pub link_usage: Usage,\n    pub link_usage_page: Usage,\n    pub parent: u16,\n    pub number_of_children: u16,\n    pub next_sibling: u16,\n    pub first_child: u16,\n    pub bits: u32,\n}\n\nimpl LinkCollectionNode {\n    pub fn is_alias(&self) -> bool {\n        self.bits & 1u32 << 8 != 0\n    }\n    pub fn collection_type(&self) -> u8 {\n        (self.bits & 0xFFu32) as u8\n    }\n}\n\nconst_assert!(size_of::<CapsInfo>() == 8);\n#[derive(Copy, Clone)]\n#[repr(C)]\npub struct CapsInfo {\n    pub first_cap: u16,\n    pub number_of_caps: u16,\n    pub last_cap: u16,\n    pub report_byte_length: u16,\n}\n\nconst_assert!(size_of::<UnknownToken>() == 8);\n#[derive(Copy, Clone)]\n#[repr(C)]\npub struct UnknownToken {\n    pub token: u8,\n    _reserved: [u8; 3],\n    pub bit_field: u32,\n}\n\n#[derive(Copy, Clone)]\n#[repr(C)]\npub struct Button {\n    pub logical_min: i32,\n    pub logical_max: i32,\n}\n\n#[derive(Copy, Clone)]\n#[repr(C)]\npub struct NotButton {\n    pub has_nul: u8,\n    _reserved: [u8; 3],\n    pub logical_min: i32,\n    pub logical_max: i32,\n    pub physical_min: i32,\n    pub physical_max: i32,\n}\n\n#[derive(Copy, Clone)]\n#[repr(C)]\nunion MaybeButton {\n    button: Button,\n    not_button: NotButton,\n}\n\n#[derive(Copy, Clone)]\n#[repr(C)]\npub struct Range {\n    pub usage_min: Usage,\n    pub usage_max: Usage,\n    pub string_min: u16,\n    pub string_max: u16,\n    pub designator_min: u16,\n    pub designator_max: u16,\n    pub data_index_min: u16,\n    pub data_index_max: u16,\n}\n\n#[derive(Copy, Clone)]\n#[repr(C)]\npub struct NotRange {\n    pub usage: Usage,\n    _reserved1: Usage,\n    pub string_index: u16,\n    _reserved2: u16,\n    pub designator_index: u16,\n    _reserved3: u16,\n    pub data_index: u16,\n    _reserved4: u16,\n}\n\n#[derive(Copy, Clone)]\n#[repr(C)]\nunion MaybeRange {\n    range: Range,\n    not_range: NotRange,\n}\n\nconst_assert!(size_of::<Caps>() == 104);\n#[derive(Copy, Clone)]\n#[repr(C)]\npub struct Caps {\n    pub usage_page: Usage,\n    pub report_id: u8,\n    pub bit_position: u8,\n    pub report_size: u16,\n    pub report_count: u16,\n    pub byte_position: u16,\n    pub bit_count: u16,\n    pub bit_field: u32,\n    pub next_byte_position: u16,\n    pub link_collection: u16,\n    pub link_usage_page: Usage,\n    pub link_usage: Usage,\n    pub flags: u8,\n    _reserved: [u8; 3],\n    pub unknown_tokens: [UnknownToken; 4],\n    maybe_range: MaybeRange,\n    maybe_button: MaybeButton,\n    pub units: u32,\n    pub units_exp: u32,\n}\n\nimpl Caps {\n    pub fn is_button_cap(&self) -> bool {\n        self.flags & (1 << 2) != 0\n    }\n    pub fn is_range(&self) -> bool {\n        self.flags & (1 << 4) != 0\n    }\n    pub fn is_alias(&self) -> bool {\n        self.flags & (1 << 5) != 0\n    }\n    pub fn is_string_range(&self) -> bool {\n        self.flags & (1 << 6) != 0\n    }\n    pub fn is_designator_range(&self) -> bool {\n        self.flags & (1 << 7) != 0\n    }\n\n    pub fn range(&self) -> Range {\n        //Both union elements have the same size and are valid for all bit patterns\n        unsafe { self.maybe_range.range }\n    }\n\n    pub fn not_range(&self) -> NotRange {\n        //Both union elements have the same size and are valid for all bit patterns\n        unsafe { self.maybe_range.not_range }\n    }\n\n    pub fn button(&self) -> Button {\n        //Both union elements have the same size and are valid for all bit patterns\n        unsafe { self.maybe_button.button }\n    }\n\n    pub fn not_button(&self) -> NotButton {\n        //Both union elements have the same size and are valid for all bit patterns\n        unsafe { self.maybe_button.not_button }\n    }\n\n    pub fn get_bit_range(&self) -> BitRange {\n        let first_bit = (self.byte_position - 1) * 8 + self.bit_position as u16;\n        let last_bit = first_bit + self.report_size * self.report_count - 1;\n        BitRange {\n            first_bit,\n            last_bit,\n        }\n    }\n}\n\n#[derive(Copy, Clone)]\n#[repr(C)]\npub struct HidpPreparsedData {\n    pub magic_key: [u8; 8],\n    pub usage: Usage,\n    pub usage_page: Usage,\n    _reserved: [u16; 2],\n    pub caps_info: [CapsInfo; 3],\n    pub first_byte_of_link_collection_array: u16,\n    pub number_link_collection_nodes: u16,\n}\n"
  },
  {
    "path": "src/windows_native/descriptor/types.rs",
    "content": "#![allow(dead_code)]\n\nuse std::fmt::Debug;\n\n#[derive(Copy, Clone, Eq, PartialEq, Hash)]\n#[repr(u16)]\npub enum ReportType {\n    Input = 0x0,\n    Output = 0x1,\n    Feature = 0x2,\n}\nimpl ReportType {\n    pub const fn values() -> impl IntoIterator<Item = Self> {\n        [Self::Input, Self::Output, Self::Feature]\n    }\n}\n\n#[derive(Debug, Copy, Clone, Eq, PartialEq)]\n#[repr(u8)]\npub enum Items {\n    MainInput = 0x80,              // 1000 00 nn\n    MainOutput = 0x90,             // 1001 00 nn\n    MainFeature = 0xB0,            // 1011 00 nn\n    MainCollection = 0xA0,         // 1010 00 nn\n    MainCollectionEnd = 0xC0,      // 1100 00 nn\n    GlobalUsagePage = 0x04,        // 0000 01 nn\n    GlobalLogicalMinimum = 0x14,   // 0001 01 nn\n    GlobalLogicalMaximum = 0x24,   // 0010 01 nn\n    GlobalPhysicalMinimum = 0x34,  // 0011 01 nn\n    GlobalPhysicalMaximum = 0x44,  // 0100 01 nn\n    GlobalUnitExponent = 0x54,     // 0101 01 nn\n    GlobalUnit = 0x64,             // 0110 01 nn\n    GlobalReportSize = 0x74,       // 0111 01 nn\n    GlobalReportId = 0x84,         // 1000 01 nn\n    GlobalReportCount = 0x94,      // 1001 01 nn\n    GlobalPush = 0xA4,             // 1010 01 nn\n    GlobalPop = 0xB4,              // 1011 01 nn\n    LocalUsage = 0x08,             // 0000 10 nn\n    LocalUsageMinimum = 0x18,      // 0001 10 nn\n    LocalUsageMaximum = 0x28,      // 0010 10 nn\n    LocalDesignatorIndex = 0x38,   // 0011 10 nn\n    LocalDesignatorMinimum = 0x48, // 0100 10 nn\n    LocalDesignatorMaximum = 0x58, // 0101 10 nn\n    LocalString = 0x78,            // 0111 10 nn\n    LocalStringMinimum = 0x88,     // 1000 10 nn\n    LocalStringMaximum = 0x98,     // 1001 10 nn\n    LocalDelimiter = 0xA8,         // 1010 10 nn\n}\n\n#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]\n#[repr(u16)]\npub enum MainItems {\n    Input = ReportType::Input as u16,\n    Output = ReportType::Output as u16,\n    Feature = ReportType::Feature as u16,\n    Collection,\n    CollectionEnd,\n    DelimiterOpen,\n    DelimiterUsage,\n    DelimiterClose,\n}\n\nimpl From<ReportType> for MainItems {\n    fn from(value: ReportType) -> Self {\n        match value {\n            ReportType::Input => Self::Input,\n            ReportType::Output => Self::Output,\n            ReportType::Feature => Self::Feature,\n        }\n    }\n}\n\nimpl TryFrom<MainItems> for ReportType {\n    type Error = ();\n\n    fn try_from(value: MainItems) -> Result<Self, Self::Error> {\n        match value {\n            MainItems::Input => Ok(Self::Input),\n            MainItems::Output => Ok(Self::Output),\n            MainItems::Feature => Ok(Self::Feature),\n            _ => Err(()),\n        }\n    }\n}\n\n#[derive(Default, Copy, Clone, Eq, PartialEq)]\npub struct BitRange {\n    pub first_bit: u16,\n    pub last_bit: u16,\n}\n\nimpl BitRange {\n    pub fn merge(self, other: BitRange) -> BitRange {\n        BitRange {\n            first_bit: self.first_bit.min(other.first_bit),\n            last_bit: self.last_bit.max(other.last_bit),\n        }\n    }\n}\n\n#[derive(Debug, Copy, Clone, Eq, PartialEq)]\npub enum ItemNodeType {\n    Cap,\n    Padding,\n    Collection,\n}\n\n#[derive(Debug, Copy, Clone, Eq, PartialEq)]\npub struct MainItemNode {\n    pub first_bit: u16,\n    pub last_bit: u16,\n    pub node_type: ItemNodeType,\n    pub caps_index: i32,\n    pub collection_index: usize,\n    pub main_item_type: MainItems,\n    pub report_id: u8,\n}\n\nimpl MainItemNode {\n    pub fn new(\n        first_bit: u16,\n        last_bit: u16,\n        node_type: ItemNodeType,\n        caps_index: i32,\n        collection_index: usize,\n        main_item_type: MainItems,\n        report_id: u8,\n    ) -> Self {\n        Self {\n            first_bit,\n            last_bit,\n            node_type,\n            caps_index,\n            collection_index,\n            main_item_type,\n            report_id,\n        }\n    }\n}\n"
  },
  {
    "path": "src/windows_native/dev_node.rs",
    "content": "use crate::windows_native::error::{check_config, WinError, WinResult};\nuse crate::windows_native::string::U16Str;\nuse crate::windows_native::types::{DeviceProperty, PropertyKey};\nuse std::ptr::null_mut;\nuse windows_sys::Win32::Devices::DeviceAndDriverInstallation::{\n    CM_Get_DevNode_PropertyW, CM_Get_Parent, CM_Locate_DevNodeW, CM_LOCATE_DEVNODE_NORMAL,\n    CR_BUFFER_SMALL, CR_SUCCESS,\n};\n\n#[repr(transparent)]\n#[derive(Debug, Copy, Clone, Eq, PartialEq)]\npub struct DevNode(u32);\n\nimpl DevNode {\n    pub fn from_device_id(device_id: &U16Str) -> WinResult<Self> {\n        let mut node = 0;\n        let cr =\n            unsafe { CM_Locate_DevNodeW(&mut node, device_id.as_ptr(), CM_LOCATE_DEVNODE_NORMAL) };\n        check_config(cr, CR_SUCCESS)?;\n        Ok(Self(node))\n    }\n\n    pub fn parent(self) -> WinResult<Self> {\n        let mut parent = 0;\n        let cr = unsafe { CM_Get_Parent(&mut parent, self.0, 0) };\n        check_config(cr, CR_SUCCESS)?;\n        Ok(Self(parent))\n    }\n\n    fn get_property_size<T: DeviceProperty>(\n        self,\n        property_key: impl PropertyKey,\n    ) -> WinResult<usize> {\n        let mut property_type = 0;\n        let mut len = 0;\n        let cr = unsafe {\n            CM_Get_DevNode_PropertyW(\n                self.0,\n                property_key.as_ptr(),\n                &mut property_type,\n                null_mut(),\n                &mut len,\n                0,\n            )\n        };\n        check_config(cr, CR_BUFFER_SMALL)?;\n        ensure!(\n            property_type == T::TYPE,\n            Err(WinError::WrongPropertyDataType)\n        );\n        Ok(len as usize)\n    }\n\n    pub fn get_property<T: DeviceProperty>(self, property_key: impl PropertyKey) -> WinResult<T> {\n        let size = self.get_property_size::<T>(property_key)?;\n        let mut property = T::create_sized(size);\n        let mut property_type = 0;\n        let mut len = size as u32;\n        let cr = unsafe {\n            CM_Get_DevNode_PropertyW(\n                self.0,\n                property_key.as_ptr(),\n                &mut property_type,\n                property.as_ptr_mut(),\n                &mut len,\n                0,\n            )\n        };\n        check_config(cr, CR_SUCCESS)?;\n        ensure!(size == len as usize, Err(WinError::UnexpectedReturnSize));\n        property.validate();\n        Ok(property)\n    }\n}\n"
  },
  {
    "path": "src/windows_native/device_info.rs",
    "content": "use crate::windows_native::dev_node::DevNode;\nuse crate::windows_native::error::WinResult;\nuse crate::windows_native::hid::{get_hid_attributes, PreparsedData};\nuse crate::windows_native::interfaces::Interface;\nuse crate::windows_native::string::{U16Str, U16String, U16StringList};\nuse crate::windows_native::types::{Handle, InternalBusType};\nuse crate::{BusType, DeviceInfo, WcharString};\nuse std::ffi::{c_void, CString};\nuse std::mem::{size_of, zeroed};\nuse windows_sys::core::GUID;\nuse windows_sys::Win32::Devices::HumanInterfaceDevice::{\n    HidD_GetManufacturerString, HidD_GetProductString, HidD_GetSerialNumberString,\n};\nuse windows_sys::Win32::Devices::Properties::{\n    DEVPKEY_Device_CompatibleIds, DEVPKEY_Device_HardwareIds, DEVPKEY_Device_InstanceId,\n    DEVPKEY_Device_Manufacturer, DEVPKEY_NAME,\n};\nuse windows_sys::Win32::Foundation::{HANDLE, PROPERTYKEY};\n\n// These constants are only part of the heavyweight `windows` and not `windows-sys`,\n// so we manually define them here.\n#[allow(nonstandard_style)]\nconst PKEY_DeviceInterface_Bluetooth_DeviceAddress: PROPERTYKEY = PROPERTYKEY {\n    fmtid: GUID::from_u128(0x2bd67d8b_8beb_48d5_87e0_6cda3428040a),\n    pid: 1,\n};\n#[allow(nonstandard_style)]\nconst PKEY_DeviceInterface_Bluetooth_Manufacturer: PROPERTYKEY = PROPERTYKEY {\n    fmtid: GUID::from_u128(0x2bd67d8b_8beb_48d5_87e0_6cda3428040a),\n    pid: 4,\n};\n#[allow(nonstandard_style)]\nconst PKEY_DeviceInterface_Bluetooth_ModelNumber: PROPERTYKEY = PROPERTYKEY {\n    fmtid: GUID::from_u128(0x2bd67d8b_8beb_48d5_87e0_6cda3428040a),\n    pid: 5,\n};\n\nfn read_string(\n    func: unsafe extern \"system\" fn(HANDLE, *mut c_void, u32) -> bool,\n    handle: &Handle,\n) -> WcharString {\n    // Return empty string on failure to match the c implementation\n    let mut string = [0u16; 256];\n    if unsafe {\n        func(\n            handle.as_raw(),\n            string.as_mut_ptr() as _,\n            (size_of::<u16>() * string.len()) as u32,\n        )\n    } {\n        U16Str::from_slice_list(&string)\n            .map(WcharString::from)\n            .next()\n            .unwrap_or_else(|| WcharString::String(String::new()))\n    } else {\n        // WcharString::None\n        WcharString::String(String::new())\n    }\n}\n\npub fn get_device_info(path: &U16Str, handle: &Handle) -> DeviceInfo {\n    let attrib = get_hid_attributes(handle);\n    let caps = PreparsedData::load(handle)\n        .and_then(|data| data.get_caps())\n        .unwrap_or(unsafe { zeroed() });\n    let mut dev = DeviceInfo {\n        path: CString::new(path.to_string()).unwrap(),\n        vendor_id: attrib.VendorID,\n        product_id: attrib.ProductID,\n        serial_number: read_string(HidD_GetSerialNumberString, handle),\n        release_number: attrib.VersionNumber,\n        manufacturer_string: read_string(HidD_GetManufacturerString, handle),\n        product_string: read_string(HidD_GetProductString, handle),\n        usage_page: caps.UsagePage,\n        usage: caps.Usage,\n        interface_number: -1,\n        bus_type: BusType::Unknown,\n    };\n\n    // If this fails just ignore it. The data might be incomplete but at least there is something\n    let _ = get_internal_info(path, &mut dev);\n    dev\n}\n\nfn get_internal_info(interface_path: &U16Str, dev: &mut DeviceInfo) -> WinResult<()> {\n    let device_id: U16String = Interface::get_property(interface_path, DEVPKEY_Device_InstanceId)?;\n\n    let dev_node = DevNode::from_device_id(&device_id)?.parent()?;\n\n    let compatible_ids: U16StringList = dev_node.get_property(DEVPKEY_Device_CompatibleIds)?;\n\n    let bus_type = compatible_ids\n        .iter()\n        .filter_map(|compatible_id| match compatible_id {\n            // The hidapi c library uses `contains` instead of `starts_with`,\n            // but as far as I can tell `starts_with` is a better choice\n            // USB devices\n            // https://docs.microsoft.com/windows-hardware/drivers/hid/plug-and-play-support\n            // https://docs.microsoft.com/windows-hardware/drivers/install/standard-usb-identifiers\n            id if id.starts_with_ignore_case(\"USB\") => Some(InternalBusType::Usb),\n            // Bluetooth devices\n            // https://docs.microsoft.com/windows-hardware/drivers/bluetooth/installing-a-bluetooth-device\n            id if id.starts_with_ignore_case(\"BTHENUM\") => Some(InternalBusType::Bluetooth),\n            id if id.starts_with_ignore_case(\"BTHLEDEVICE\") => Some(InternalBusType::BluetoothLE),\n            // I2C devices\n            // https://docs.microsoft.com/windows-hardware/drivers/hid/plug-and-play-support-and-power-management\n            id if id.starts_with_ignore_case(\"PNP0C50\") => Some(InternalBusType::I2c),\n            // SPI devices\n            // https://docs.microsoft.com/windows-hardware/drivers/hid/plug-and-play-for-spi\n            id if id.starts_with_ignore_case(\"PNP0C51\") => Some(InternalBusType::Spi),\n            _ => None,\n        })\n        .next()\n        .unwrap_or(InternalBusType::Unknown);\n    dev.bus_type = bus_type.into();\n    match bus_type {\n        InternalBusType::Usb => get_usb_info(dev, dev_node)?,\n        InternalBusType::BluetoothLE => get_ble_info(dev, dev_node)?,\n        _ => (),\n    };\n\n    Ok(())\n}\n\nfn get_usb_info(dev: &mut DeviceInfo, mut dev_node: DevNode) -> WinResult<()> {\n    let mut device_id: U16String = dev_node.get_property(DEVPKEY_Device_InstanceId)?;\n\n    device_id.make_uppercase_ascii();\n    // Check for Xbox Common Controller class (XUSB) device.\n    // https://docs.microsoft.com/windows/win32/xinput/directinput-and-xusb-devices\n    // https://docs.microsoft.com/windows/win32/xinput/xinput-and-directinput\n    //\n    if extract_int_token_value(&device_id, \"IG_\").is_some() {\n        dev_node = dev_node.parent()?;\n    }\n\n    let mut hardware_ids: U16StringList = dev_node.get_property(DEVPKEY_Device_HardwareIds)?;\n\n    // Get additional information from USB device's Hardware ID\n    // https://docs.microsoft.com/windows-hardware/drivers/install/standard-usb-identifiers\n    // https://docs.microsoft.com/windows-hardware/drivers/usbcon/enumeration-of-interfaces-not-grouped-in-collections\n    //\n    for hardware_id in hardware_ids.iter_mut() {\n        hardware_id.make_uppercase_ascii();\n\n        if dev.release_number == 0 {\n            if let Some(release_number) = extract_int_token_value(hardware_id, \"REV_\") {\n                dev.release_number = release_number as u16;\n            }\n        }\n        if dev.interface_number == -1 {\n            if let Some(interface_number) = extract_int_token_value(hardware_id, \"MI_\") {\n                dev.interface_number = interface_number as i32;\n            }\n        }\n    }\n\n    // Try to get USB device manufacturer string if not provided by HidD_GetManufacturerString.\n    if dev.manufacturer_string().map_or(true, str::is_empty) {\n        if let Ok(manufacturer_string) =\n            dev_node.get_property::<U16String>(DEVPKEY_Device_Manufacturer)\n        {\n            dev.manufacturer_string = (&*manufacturer_string).into();\n        }\n    }\n\n    // Try to get USB device serial number if not provided by HidD_GetSerialNumberString.\n    if dev.serial_number().map_or(true, str::is_empty) {\n        let mut usb_dev_node = dev_node;\n        if dev.interface_number != -1 {\n            // Get devnode parent to reach out composite parent USB device.\n            // https://docs.microsoft.com/windows-hardware/drivers/usbcon/enumeration-of-the-composite-parent-device\n            usb_dev_node = dev_node.parent()?;\n        }\n\n        let device_id: U16String = usb_dev_node.get_property(DEVPKEY_Device_InstanceId)?;\n\n        // Extract substring after last '\\\\' of Instance ID.\n        // For USB devices it may contain device's serial number.\n        // https://docs.microsoft.com/windows-hardware/drivers/install/instance-ids\n        //\n        if let Some(start) = device_id\n            .as_slice()\n            .rsplit(|c| *c != b'&' as u16)\n            .next()\n            .and_then(|s| s.iter().rposition(|c| *c != b'\\\\' as u16))\n        {\n            dev.serial_number = U16Str::from_slice(&device_id.as_slice()[(start + 1)..]).into();\n        }\n    }\n\n    if dev.interface_number == -1 {\n        dev.interface_number = 0;\n    }\n\n    Ok(())\n}\n\n// HidD_GetProductString/HidD_GetManufacturerString/HidD_GetSerialNumberString is not working for BLE HID devices\n// Request this info via dev node properties instead.\n// https://docs.microsoft.com/answers/questions/401236/hidd-getproductstring-with-ble-hid-device.html\nfn get_ble_info(dev: &mut DeviceInfo, dev_node: DevNode) -> WinResult<()> {\n    if dev.manufacturer_string().map_or(true, str::is_empty) {\n        if let Ok(manufacturer_string) =\n            dev_node.get_property::<U16String>(PKEY_DeviceInterface_Bluetooth_Manufacturer)\n        {\n            dev.manufacturer_string = manufacturer_string.into();\n        }\n    }\n\n    if dev.serial_number().map_or(true, str::is_empty) {\n        if let Ok(serial_number) =\n            dev_node.get_property::<U16String>(PKEY_DeviceInterface_Bluetooth_DeviceAddress)\n        {\n            dev.serial_number = serial_number.into();\n        }\n    }\n\n    if dev.product_string().map_or(true, str::is_empty) {\n        let product_string = dev_node\n            .get_property::<U16String>(PKEY_DeviceInterface_Bluetooth_ModelNumber)\n            .or_else(|_| {\n                // Fallback: Get devnode grandparent to reach out Bluetooth LE device node\n                dev_node\n                    .parent()\n                    .and_then(|parent_dev_node| parent_dev_node.get_property(DEVPKEY_NAME))\n            });\n        if let Ok(product_string) = product_string {\n            dev.product_string = product_string.into();\n        }\n    }\n\n    Ok(())\n}\n\nfn extract_int_token_value(u16str: &U16Str, token: &str) -> Option<u32> {\n    let start = u16str.find_index(token)? + token.encode_utf16().count();\n    char::decode_utf16(u16str.as_slice()[start..].iter().copied())\n        .map_while(|c| c.ok().and_then(|c| c.to_digit(16)))\n        .reduce(|l, r| l * 16 + r)\n}\n"
  },
  {
    "path": "src/windows_native/error.rs",
    "content": "use crate::HidError;\nuse windows_sys::Win32::Devices::DeviceAndDriverInstallation::*;\nuse windows_sys::Win32::Foundation::*;\n\npub type WinResult<T> = Result<T, WinError>;\n\n#[derive(Debug, Clone, Eq, PartialEq)]\npub enum WinError {\n    Config(CONFIGRET),\n    Win32(Win32Error),\n    BufferTooSmall,\n    InvalidDeviceId,\n    InvalidDeviceNode,\n    NoSuchValue,\n    WrongPropertyDataType,\n    UnexpectedReturnSize,\n    InvalidPreparsedData,\n    WaitTimedOut,\n}\n\nimpl WinError {\n    pub fn last() -> Self {\n        Self::from(Win32Error::last())\n    }\n}\n\nimpl From<WinError> for HidError {\n    fn from(value: WinError) -> Self {\n        match value {\n            WinError::Win32(Win32Error::Generic(err)) => HidError::IoError {\n                error: std::io::Error::from_raw_os_error(err as _),\n            },\n            err => HidError::HidApiError {\n                message: format!(\"WinError: {:?}\", err),\n            },\n        }\n    }\n}\n\nfn config_to_error(ret: CONFIGRET) -> WinError {\n    match ret {\n        CR_BUFFER_SMALL => WinError::BufferTooSmall,\n        CR_INVALID_DEVICE_ID => WinError::InvalidDeviceId,\n        CR_INVALID_DEVNODE => WinError::InvalidDeviceNode,\n        CR_NO_SUCH_VALUE => WinError::NoSuchValue,\n        ret => WinError::Config(ret),\n    }\n}\n\npub fn check_config(ret: CONFIGRET, expected: CONFIGRET) -> WinResult<()> {\n    if ret == expected {\n        Ok(())\n    } else {\n        Err(config_to_error(ret))\n    }\n}\n\npub fn check_boolean(ret: bool) -> WinResult<()> {\n    if !ret {\n        Err(Win32Error::last().into())\n    } else {\n        Ok(())\n    }\n}\n\n#[derive(Debug, Copy, Clone, Eq, PartialEq)]\npub enum Win32Error {\n    Generic(WIN32_ERROR),\n    Success,\n    IoPending,\n    WaitTimedOut,\n}\n\nimpl Win32Error {\n    pub fn last() -> Self {\n        match unsafe { GetLastError() } {\n            NO_ERROR => Self::Success,\n            ERROR_IO_PENDING => Self::IoPending,\n            ERROR_IO_INCOMPLETE | WAIT_TIMEOUT => Self::WaitTimedOut,\n            code => Self::Generic(code),\n        }\n    }\n\n    //pub fn is_error(self) -> bool {\n    //    !matches!(self, Win32Error::Success | Win32Error::IoPending)\n    //}\n}\n\nimpl From<Win32Error> for WinError {\n    fn from(value: Win32Error) -> Self {\n        match value {\n            Win32Error::WaitTimedOut => Self::WaitTimedOut,\n            err => Self::Win32(err),\n        }\n    }\n}\n\nimpl From<Win32Error> for HidError {\n    fn from(value: Win32Error) -> Self {\n        HidError::from(WinError::from(value))\n    }\n}\n"
  },
  {
    "path": "src/windows_native/hid.rs",
    "content": "use crate::windows_native::error::{check_boolean, WinError, WinResult};\nuse crate::windows_native::types::Handle;\nuse std::ffi::c_void;\nuse std::mem::{size_of, zeroed};\nuse windows_sys::core::GUID;\nuse windows_sys::Win32::Devices::HumanInterfaceDevice::{\n    HidD_FreePreparsedData, HidD_GetAttributes, HidD_GetHidGuid, HidD_GetPreparsedData,\n    HidP_GetCaps, HIDD_ATTRIBUTES, HIDP_CAPS, HIDP_STATUS_SUCCESS,\n};\n\npub fn get_interface_guid() -> GUID {\n    unsafe {\n        let mut guid = zeroed();\n        HidD_GetHidGuid(&mut guid);\n        guid\n    }\n}\n\npub fn get_hid_attributes(handle: &Handle) -> HIDD_ATTRIBUTES {\n    unsafe {\n        let mut attrib = HIDD_ATTRIBUTES {\n            Size: size_of::<HIDD_ATTRIBUTES>() as u32,\n            ..zeroed()\n        };\n        HidD_GetAttributes(handle.as_raw(), &mut attrib);\n        attrib\n    }\n}\n\n#[repr(transparent)]\npub struct PreparsedData(isize);\n\nimpl Drop for PreparsedData {\n    fn drop(&mut self) {\n        unsafe {\n            HidD_FreePreparsedData(self.0);\n        }\n    }\n}\n\nimpl PreparsedData {\n    pub fn load(handle: &Handle) -> WinResult<Self> {\n        let mut pp_data = 0;\n        check_boolean(unsafe { HidD_GetPreparsedData(handle.as_raw(), &mut pp_data) })?;\n        ensure!(pp_data != 0, Err(WinError::InvalidPreparsedData));\n        Ok(Self(pp_data))\n    }\n\n    #[allow(dead_code)]\n    pub fn as_ptr(&self) -> *const c_void {\n        self.0 as _\n    }\n\n    pub fn get_caps(&self) -> WinResult<HIDP_CAPS> {\n        unsafe {\n            let mut caps = zeroed();\n            let r = HidP_GetCaps(self.0, &mut caps);\n            ensure!(\n                r == HIDP_STATUS_SUCCESS,\n                Err(WinError::InvalidPreparsedData)\n            );\n            Ok(caps)\n        }\n    }\n}\n"
  },
  {
    "path": "src/windows_native/interfaces.rs",
    "content": "use crate::windows_native::error::{check_config, WinError, WinResult};\nuse crate::windows_native::hid::get_interface_guid;\nuse crate::windows_native::string::{U16Str, U16StringList};\nuse crate::windows_native::types::{DeviceProperty, PropertyKey};\nuse std::ptr::{null, null_mut};\nuse windows_sys::core::GUID;\nuse windows_sys::Win32::Devices::DeviceAndDriverInstallation::{\n    CM_Get_Device_Interface_ListW, CM_Get_Device_Interface_List_SizeW,\n    CM_Get_Device_Interface_PropertyW, CM_GET_DEVICE_INTERFACE_LIST_PRESENT, CR_BUFFER_SMALL,\n    CR_SUCCESS,\n};\n\npub struct Interface;\n\nimpl Interface {\n    fn get_property_size<T: DeviceProperty>(\n        interface: &U16Str,\n        property_key: impl PropertyKey,\n    ) -> WinResult<usize> {\n        let mut property_type = 0;\n        let mut len = 0;\n        let cr = unsafe {\n            CM_Get_Device_Interface_PropertyW(\n                interface.as_ptr(),\n                property_key.as_ptr(),\n                &mut property_type,\n                null_mut(),\n                &mut len,\n                0,\n            )\n        };\n        check_config(cr, CR_BUFFER_SMALL)?;\n        ensure!(\n            property_type == T::TYPE,\n            Err(WinError::WrongPropertyDataType)\n        );\n        Ok(len as usize)\n    }\n\n    pub fn get_property<T: DeviceProperty>(\n        interface: &U16Str,\n        property_key: impl PropertyKey,\n    ) -> WinResult<T> {\n        let size = Self::get_property_size::<T>(interface, property_key)?;\n        let mut property = T::create_sized(size);\n        let mut property_type = 0;\n        let mut len = size as u32;\n        let cr = unsafe {\n            CM_Get_Device_Interface_PropertyW(\n                interface.as_ptr(),\n                property_key.as_ptr(),\n                &mut property_type,\n                property.as_ptr_mut(),\n                &mut len,\n                0,\n            )\n        };\n        check_config(cr, CR_SUCCESS)?;\n        ensure!(size == len as usize, Err(WinError::UnexpectedReturnSize));\n        property.validate();\n        Ok(property)\n    }\n\n    fn get_interface_list_length(interface: GUID) -> WinResult<usize> {\n        let mut len = 0;\n        let cr = unsafe {\n            CM_Get_Device_Interface_List_SizeW(\n                &mut len,\n                &interface,\n                null(),\n                CM_GET_DEVICE_INTERFACE_LIST_PRESENT,\n            )\n        };\n        check_config(cr, CR_SUCCESS)?;\n        Ok(len as usize)\n    }\n\n    pub fn get_interface_list() -> WinResult<U16StringList> {\n        let interface_class_guid = get_interface_guid();\n\n        let mut device_interface_list = Vec::new();\n        loop {\n            device_interface_list.resize(Self::get_interface_list_length(interface_class_guid)?, 0);\n            let cr = unsafe {\n                CM_Get_Device_Interface_ListW(\n                    &interface_class_guid,\n                    null(),\n                    device_interface_list.as_mut_ptr(),\n                    device_interface_list.len() as u32,\n                    CM_GET_DEVICE_INTERFACE_LIST_PRESENT,\n                )\n            };\n            if cr == CR_SUCCESS {\n                return Ok(U16StringList(device_interface_list));\n            }\n            check_config(cr, CR_BUFFER_SMALL)?;\n        }\n    }\n}\n"
  },
  {
    "path": "src/windows_native/mod.rs",
    "content": "//! The implementation which uses the the raw win32 api to perform operations\n\nmacro_rules! ensure {\n    ($cond:expr, $result:expr) => {\n        if !($cond) {\n            return $result;\n        }\n    };\n}\n\nmod descriptor;\nmod dev_node;\nmod device_info;\nmod error;\nmod hid;\nmod interfaces;\nmod string;\nmod types;\nmod utils;\n\nuse std::cell::{Cell, RefCell};\nuse std::ptr::{null, null_mut};\nuse std::{\n    ffi::CStr,\n    fmt::{self, Debug},\n};\n\nuse crate::windows_native::dev_node::DevNode;\nuse crate::windows_native::device_info::get_device_info;\nuse crate::windows_native::error::{check_boolean, Win32Error, WinError, WinResult};\nuse crate::windows_native::hid::{get_hid_attributes, PreparsedData};\nuse crate::windows_native::interfaces::Interface;\nuse crate::windows_native::string::{U16Str, U16String};\nuse crate::windows_native::types::{Handle, Overlapped};\nuse crate::{DeviceInfo, HidDeviceBackendBase, HidDeviceBackendWindows, HidError, HidResult};\nuse windows_sys::core::GUID;\nuse windows_sys::Win32::Devices::HumanInterfaceDevice::{\n    HidD_GetIndexedString, HidD_SetFeature, HidD_SetNumInputBuffers, HidD_SetOutputReport,\n};\nuse windows_sys::Win32::Devices::Properties::{\n    DEVPKEY_Device_ContainerId, DEVPKEY_Device_InstanceId,\n};\nuse windows_sys::Win32::Foundation::{GENERIC_READ, GENERIC_WRITE, INVALID_HANDLE_VALUE, TRUE};\nuse windows_sys::Win32::Storage::FileSystem::{\n    CreateFileW, ReadFile, WriteFile, FILE_FLAG_OVERLAPPED, FILE_SHARE_READ, FILE_SHARE_WRITE,\n    OPEN_EXISTING,\n};\nuse windows_sys::Win32::System::Threading::ResetEvent;\nuse windows_sys::Win32::System::IO::{CancelIoEx, DeviceIoControl};\n\nconst STRING_BUF_LEN: usize = 128;\n\npub struct HidApiBackend;\nimpl HidApiBackend {\n    pub fn get_hid_device_info_vector(vid: u16, pid: u16) -> HidResult<Vec<DeviceInfo>> {\n        Ok(enumerate_devices(vid, pid)?)\n    }\n\n    pub fn open(vid: u16, pid: u16) -> HidResult<HidDevice> {\n        open(vid, pid, None)\n    }\n\n    pub fn open_serial(vid: u16, pid: u16, sn: &str) -> HidResult<HidDevice> {\n        open(vid, pid, Some(sn))\n    }\n\n    pub fn open_path(device_path: &CStr) -> HidResult<HidDevice> {\n        open_path(device_path)\n    }\n}\n\n/// Object for accessing HID device\npub struct HidDevice {\n    device_handle: Handle,\n    device_info: DeviceInfo,\n    read_pending: Cell<bool>,\n    blocking: Cell<bool>,\n    read_state: RefCell<AsyncState>,\n    write_state: RefCell<AsyncState>,\n    feature_state: RefCell<AsyncState>,\n}\n\nunsafe impl Send for HidDevice {}\n\nstruct AsyncState {\n    overlapped: Box<Overlapped>,\n    buffer: Vec<u8>,\n}\n\nimpl AsyncState {\n    fn new(report_size: usize) -> Self {\n        Self {\n            overlapped: Default::default(),\n            buffer: vec![0u8; report_size],\n        }\n    }\n\n    fn clear_buffer(&mut self) {\n        self.buffer.fill(0)\n    }\n\n    fn fill_buffer(&mut self, data: &[u8]) {\n        // Make sure the right number of bytes are passed to WriteFile. Windows\n        // expects the number of bytes which are in the _longest_ report (plus\n        // one for the report number) bytes even if the data is a report\n        // which is shorter than that. Windows gives us this value in\n        // caps.OutputReportByteLength. If a user passes in fewer bytes than this,\n        // use cached temporary buffer which is the proper size.\n        let data_size = data.len().min(self.buffer.len());\n        self.buffer[..data_size].copy_from_slice(&data[..data_size]);\n        if data_size < self.buffer.len() {\n            self.buffer[data_size..].fill(0);\n        }\n    }\n\n    fn buffer_len(&self) -> usize {\n        self.buffer.len()\n    }\n\n    fn buffer_ptr(&mut self) -> *mut u8 {\n        self.buffer.as_mut_ptr()\n    }\n}\n\nimpl Debug for HidDevice {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"HidDevice\").finish()\n    }\n}\n\nimpl HidDeviceBackendBase for HidDevice {\n    fn write(&self, data: &[u8]) -> HidResult<usize> {\n        ensure!(!data.is_empty(), Err(HidError::InvalidZeroSizeData));\n        let mut state = self.write_state.borrow_mut();\n        state.fill_buffer(data);\n\n        let res = unsafe {\n            WriteFile(\n                self.device_handle.as_raw(),\n                state.buffer_ptr(),\n                state.buffer_len() as u32,\n                null_mut(),\n                state.overlapped.as_raw(),\n            )\n        };\n\n        if res != TRUE {\n            let err = Win32Error::last();\n            ensure!(err == Win32Error::IoPending, Err(err.into()));\n            Ok(state\n                .overlapped\n                .get_result(&self.device_handle, Some(1000))?)\n        } else {\n            Ok(0)\n        }\n    }\n\n    fn read(&self, buf: &mut [u8]) -> HidResult<usize> {\n        self.read_timeout(buf, if self.blocking.get() { -1 } else { 0 })\n    }\n\n    fn read_timeout(&self, buf: &mut [u8], timeout: i32) -> HidResult<usize> {\n        ensure!(!buf.is_empty(), Err(HidError::InvalidZeroSizeData));\n        let mut bytes_read = 0;\n        let mut io_runnig = false;\n        let mut state = self.read_state.borrow_mut();\n\n        if !self.read_pending.get() {\n            self.read_pending.set(true);\n            state.clear_buffer();\n            let res = unsafe {\n                ResetEvent(state.overlapped.event_handle());\n                ReadFile(\n                    self.device_handle.as_raw(),\n                    state.buffer_ptr() as _,\n                    state.buffer_len() as u32,\n                    &mut bytes_read,\n                    state.overlapped.as_raw(),\n                )\n            };\n            if res != TRUE {\n                let err = Win32Error::last();\n                if err != Win32Error::IoPending {\n                    unsafe { CancelIoEx(self.device_handle.as_raw(), state.overlapped.as_raw()) };\n                    self.read_pending.set(false);\n                    return Err(err.into());\n                }\n                io_runnig = true;\n            }\n        } else {\n            io_runnig = true;\n        }\n\n        if io_runnig {\n            let res = state\n                .overlapped\n                .get_result(&self.device_handle, u32::try_from(timeout).ok());\n            bytes_read = match res {\n                Ok(written) => written as u32,\n                //There was no data this time. Return zero bytes available, but leave the Overlapped I/O running.\n                Err(WinError::WaitTimedOut) => return Ok(0),\n                Err(err) => {\n                    self.read_pending.set(false);\n                    return Err(err.into());\n                }\n            };\n        }\n        self.read_pending.set(false);\n\n        let mut copy_len = 0;\n        if bytes_read > 0 {\n            // If report numbers aren't being used, but Windows sticks a report\n            // number (0x0) on the beginning of the report anyway. To make this\n            // work like the other platforms, and to make it work more like the\n            // HID spec, we'll skip over this byte.\n            if state.buffer[0] == 0x0 {\n                bytes_read -= 1;\n                copy_len = usize::min(bytes_read as usize, buf.len());\n                buf[..copy_len].copy_from_slice(&state.buffer[1..(1 + copy_len)]);\n            } else {\n                copy_len = usize::min(bytes_read as usize, buf.len());\n                buf[..copy_len].copy_from_slice(&state.buffer[0..copy_len]);\n            }\n        }\n        Ok(copy_len)\n    }\n\n    fn send_feature_report(&self, data: &[u8]) -> HidResult<()> {\n        ensure!(!data.is_empty(), Err(HidError::InvalidZeroSizeData));\n        let mut state = self.feature_state.borrow_mut();\n        state.fill_buffer(data);\n\n        check_boolean(unsafe {\n            HidD_SetFeature(\n                self.device_handle.as_raw(),\n                state.buffer_ptr() as _,\n                state.buffer_len() as u32,\n            )\n        })?;\n\n        Ok(())\n    }\n\n    /// Set the first byte of `buf` to the 'Report ID' of the report to be read.\n    /// Upon return, the first byte will still contain the Report ID, and the\n    /// report data will start in `buf[1]`.\n    fn get_feature_report(&self, buf: &mut [u8]) -> HidResult<usize> {\n        #[allow(clippy::identity_op, clippy::double_parens)]\n        const IOCTL_HID_GET_FEATURE: u32 = ((0x0000000b) << 16) | ((0) << 14) | ((100) << 2) | (2);\n        ensure!(!buf.is_empty(), Err(HidError::InvalidZeroSizeData));\n        let mut state = self.feature_state.borrow_mut();\n        let mut bytes_returned = 0;\n\n        let res = unsafe {\n            ResetEvent(state.overlapped.event_handle());\n            DeviceIoControl(\n                self.device_handle.as_raw(),\n                IOCTL_HID_GET_FEATURE,\n                buf.as_mut_ptr() as _,\n                buf.len() as u32,\n                buf.as_mut_ptr() as _,\n                buf.len() as u32,\n                &mut bytes_returned,\n                state.overlapped.as_raw(),\n            )\n        };\n        if res != TRUE {\n            let err = Win32Error::last();\n            ensure!(err == Win32Error::IoPending, Err(err.into()))\n        }\n\n        bytes_returned = state.overlapped.get_result(&self.device_handle, None)? as u32;\n\n        if buf[0] == 0x0 {\n            bytes_returned += 1;\n        }\n\n        Ok(bytes_returned as usize)\n    }\n\n    fn send_output_report(&self, data: &[u8]) -> HidResult<()> {\n        ensure!(!data.is_empty(), Err(HidError::InvalidZeroSizeData));\n        let mut state = self.feature_state.borrow_mut();\n        state.fill_buffer(data);\n\n        check_boolean(unsafe {\n            HidD_SetOutputReport(\n                self.device_handle.as_raw(),\n                state.buffer_ptr() as _,\n                state.buffer_len() as u32,\n            )\n        })?;\n\n        Ok(())\n    }\n\n    fn set_blocking_mode(&self, blocking: bool) -> HidResult<()> {\n        self.blocking.set(blocking);\n        Ok(())\n    }\n\n    fn get_manufacturer_string(&self) -> HidResult<Option<String>> {\n        Ok(self.device_info.manufacturer_string().map(String::from))\n    }\n\n    fn get_product_string(&self) -> HidResult<Option<String>> {\n        Ok(self.device_info.product_string().map(String::from))\n    }\n\n    fn get_serial_number_string(&self) -> HidResult<Option<String>> {\n        Ok(self.device_info.serial_number().map(String::from))\n    }\n\n    fn get_indexed_string(&self, index: i32) -> HidResult<Option<String>> {\n        let mut buf = [0u16; STRING_BUF_LEN];\n        let res = unsafe {\n            HidD_GetIndexedString(\n                self.device_handle.as_raw(),\n                index as u32,\n                buf.as_mut_ptr() as _,\n                STRING_BUF_LEN as u32,\n            )\n        };\n        check_boolean(res)?;\n        Ok(buf.split(|c| *c == 0).map(String::from_utf16_lossy).next())\n    }\n\n    fn get_device_info(&self) -> HidResult<DeviceInfo> {\n        Ok(self.device_info.clone())\n    }\n\n    fn get_report_descriptor(&self, buf: &mut [u8]) -> HidResult<usize> {\n        let desc = descriptor::get_descriptor(&PreparsedData::load(&self.device_handle)?)?;\n        let size = buf.len().min(desc.len());\n        buf[..size].copy_from_slice(&desc[..size]);\n        Ok(size)\n    }\n}\n\nimpl HidDeviceBackendWindows for HidDevice {\n    fn get_container_id(&self) -> HidResult<GUID> {\n        let path =\n            U16String::try_from(self.device_info.path()).expect(\"device path is not valid unicode\");\n\n        let device_id: U16String = Interface::get_property(&path, DEVPKEY_Device_InstanceId)?;\n\n        let dev_node = DevNode::from_device_id(&device_id)?;\n        let guid = dev_node.get_property(DEVPKEY_Device_ContainerId)?;\n        Ok(guid)\n    }\n}\n\nimpl Drop for HidDevice {\n    fn drop(&mut self) {\n        unsafe {\n            for state in [\n                &mut self.read_state,\n                &mut self.write_state,\n                &mut self.feature_state,\n            ] {\n                let mut state = state.borrow_mut();\n                if CancelIoEx(self.device_handle.as_raw(), state.overlapped.as_raw()) > 0 {\n                    _ = state.overlapped.get_result(&self.device_handle, None);\n                }\n            }\n        }\n    }\n}\n\nfn enumerate_devices(vendor_id: u16, product_id: u16) -> WinResult<Vec<DeviceInfo>> {\n    Ok(Interface::get_interface_list()?\n        .iter()\n        .filter_map(|device_interface| {\n            let device_handle = open_device(device_interface, false).ok()?;\n            let attrib = get_hid_attributes(&device_handle);\n            ((vendor_id == 0 || attrib.VendorID == vendor_id)\n                && (product_id == 0 || attrib.ProductID == product_id))\n                .then(|| get_device_info(device_interface, &device_handle))\n        })\n        .collect())\n}\n\nfn open_device(path: &U16Str, open_rw: bool) -> WinResult<Handle> {\n    let handle = unsafe {\n        CreateFileW(\n            path.as_ptr(),\n            match open_rw {\n                true => GENERIC_WRITE | GENERIC_READ,\n                false => 0,\n            },\n            FILE_SHARE_READ | FILE_SHARE_WRITE,\n            null(),\n            OPEN_EXISTING,\n            FILE_FLAG_OVERLAPPED,\n            null_mut(),\n        )\n    };\n    ensure!(\n        handle != INVALID_HANDLE_VALUE,\n        Err(Win32Error::last().into())\n    );\n    Ok(Handle::from_raw(handle))\n}\n\nfn open(vid: u16, pid: u16, sn: Option<&str>) -> HidResult<HidDevice> {\n    let dev = enumerate_devices(vid, pid)?\n        .into_iter()\n        .filter(|dev| dev.vendor_id == vid && dev.product_id == pid)\n        .find(|dev| sn.map_or(true, |sn| dev.serial_number().is_some_and(|n| sn == n)))\n        .ok_or(HidError::HidApiErrorEmpty)?;\n    open_path(dev.path())\n}\n\nfn open_path(device_path: &CStr) -> HidResult<HidDevice> {\n    let device_path = U16String::try_from(device_path).unwrap();\n    let handle = open_device(&device_path, true)\n        // System devices, such as keyboards and mice, cannot be opened in\n        // read-write mode, because the system takes exclusive control over\n        // them.  This is to prevent keyloggers.  However, feature reports\n        // can still be sent and received.  Retry opening the device, but\n        // without read/write access.\n        .or_else(|_| open_device(&device_path, false))?;\n    check_boolean(unsafe { HidD_SetNumInputBuffers(handle.as_raw(), 64) })?;\n    let caps = PreparsedData::load(&handle)?.get_caps()?;\n    let device_info = get_device_info(&device_path, &handle);\n    let dev = HidDevice {\n        device_handle: handle,\n        blocking: Cell::new(true),\n        read_pending: Cell::new(false),\n        read_state: RefCell::new(AsyncState::new(caps.InputReportByteLength as usize)),\n        write_state: RefCell::new(AsyncState::new(caps.OutputReportByteLength as usize)),\n        feature_state: RefCell::new(AsyncState::new(caps.FeatureReportByteLength as usize)),\n        device_info,\n    };\n\n    Ok(dev)\n}\n"
  },
  {
    "path": "src/windows_native/string.rs",
    "content": "use crate::windows_native::types::DeviceProperty;\nuse crate::WcharString;\nuse std::ffi::CStr;\nuse std::fmt::{Debug, Formatter};\nuse std::iter::once;\nuse std::mem::size_of;\nuse std::ops::{Deref, DerefMut};\nuse std::str::Utf8Error;\nuse windows_sys::core::PCWSTR;\nuse windows_sys::Win32::Devices::Properties::{\n    DEVPROPTYPE, DEVPROP_TYPE_STRING, DEVPROP_TYPE_STRING_LIST,\n};\n\n#[repr(transparent)]\npub struct U16Str([u16]);\n\nimpl U16Str {\n    unsafe fn from_slice_unsafe(slice: &[u16]) -> &Self {\n        let ptr: *const [u16] = slice;\n        &*(ptr as *const Self)\n    }\n\n    unsafe fn from_slice_mut_unsafe(slice: &mut [u16]) -> &mut Self {\n        let ptr: *mut [u16] = slice;\n        &mut *(ptr as *mut Self)\n    }\n\n    pub fn from_slice(slice: &[u16]) -> &Self {\n        assert!(\n            slice.last().is_some_and(is_null),\n            \"Slice is not null terminated\"\n        );\n        debug_assert_eq!(\n            slice.iter().filter(|c| is_null(c)).count(),\n            1,\n            \"Found null character in the middle\"\n        );\n        unsafe { Self::from_slice_unsafe(slice) }\n    }\n\n    pub fn from_slice_mut(slice: &mut [u16]) -> &mut Self {\n        assert!(\n            slice.last().is_some_and(is_null),\n            \"Slice is not null terminated\"\n        );\n        debug_assert_eq!(\n            slice.iter().filter(|c| is_null(c)).count(),\n            1,\n            \"Found null character in the middle\"\n        );\n        unsafe { Self::from_slice_mut_unsafe(slice) }\n    }\n\n    pub fn from_slice_list(slice: &[u16]) -> impl Iterator<Item = &U16Str> {\n        slice.split_inclusive(is_null).map(Self::from_slice)\n    }\n\n    pub fn from_slice_list_mut(slice: &mut [u16]) -> impl Iterator<Item = &mut U16Str> {\n        slice.split_inclusive_mut(is_null).map(Self::from_slice_mut)\n    }\n\n    pub fn as_ptr(&self) -> PCWSTR {\n        self.0.as_ptr()\n    }\n\n    pub fn as_slice(&self) -> &[u16] {\n        &self.0[..self.0.len() - 1]\n    }\n    pub fn as_slice_mut(&mut self) -> &mut [u16] {\n        let end = self.0.len() - 1;\n        &mut self.0[..end]\n    }\n\n    pub fn make_uppercase_ascii(&mut self) {\n        for c in self.as_slice_mut() {\n            if let Ok(t) = u8::try_from(*c) {\n                *c = t.to_ascii_uppercase().into();\n            }\n        }\n    }\n\n    pub fn starts_with_ignore_case(&self, pattern: &str) -> bool {\n        char::decode_utf16(self.as_slice().iter().copied())\n            .map(|r| r.unwrap_or(char::REPLACEMENT_CHARACTER))\n            .zip(pattern.chars())\n            .all(|(l, r)| l.eq_ignore_ascii_case(&r))\n    }\n\n    pub fn find_index(&self, pattern: &str) -> Option<usize> {\n        self.as_slice()\n            .windows(pattern.encode_utf16().count())\n            .enumerate()\n            .filter(|(_, ss)| {\n                ss.iter()\n                    .copied()\n                    .zip(pattern.encode_utf16())\n                    .all(|(l, r)| l == r)\n            })\n            .map(|(i, _)| i)\n            .next()\n    }\n}\n\nimpl ToString for U16Str {\n    fn to_string(&self) -> String {\n        String::from_utf16(self.as_slice()).expect(\"Invalid UTF-16\")\n    }\n}\n\nimpl From<&U16Str> for WcharString {\n    fn from(value: &U16Str) -> Self {\n        String::from_utf16(value.as_slice())\n            .map(WcharString::String)\n            .unwrap_or_else(|_| WcharString::Raw(value.as_slice().to_vec()))\n    }\n}\n\nimpl Debug for U16Str {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        for c in char::decode_utf16(self.as_slice().iter().copied()) {\n            write!(f, \"{}\", c.unwrap_or(char::REPLACEMENT_CHARACTER))?;\n        }\n        Ok(())\n    }\n}\n\npub struct U16String(Vec<u16>);\n\nimpl Debug for U16String {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        write!(f, \"{:?}\", self.deref())\n    }\n}\n\nimpl Deref for U16String {\n    type Target = U16Str;\n\n    fn deref(&self) -> &Self::Target {\n        unsafe { U16Str::from_slice_unsafe(self.0.as_slice()) }\n    }\n}\n\nimpl DerefMut for U16String {\n    fn deref_mut(&mut self) -> &mut Self::Target {\n        unsafe { U16Str::from_slice_mut_unsafe(self.0.as_mut_slice()) }\n    }\n}\n\nimpl TryFrom<&CStr> for U16String {\n    type Error = Utf8Error;\n\n    fn try_from(value: &CStr) -> Result<Self, Self::Error> {\n        Ok(Self(\n            value.to_str()?.encode_utf16().chain(once(0)).collect(),\n        ))\n    }\n}\n\nimpl From<U16String> for WcharString {\n    fn from(value: U16String) -> Self {\n        (&*value).into()\n    }\n}\n\nunsafe impl DeviceProperty for U16String {\n    const TYPE: DEVPROPTYPE = DEVPROP_TYPE_STRING;\n\n    fn create_sized(bytes: usize) -> Self {\n        assert_eq!(bytes % size_of::<u16>(), 0);\n        U16String(vec![0u16; bytes / size_of::<u16>()])\n    }\n\n    fn as_ptr_mut(&mut self) -> *mut u8 {\n        self.0.as_mut_ptr() as _\n    }\n\n    fn validate(&self) {\n        assert!(\n            self.0.last().is_some_and(is_null),\n            \"Slice is not null terminated\"\n        );\n        debug_assert_eq!(\n            self.0.iter().filter(|c| is_null(c)).count(),\n            1,\n            \"Found null character in the middle\"\n        );\n    }\n}\n\npub struct U16StringList(pub Vec<u16>);\n\nunsafe impl DeviceProperty for U16StringList {\n    const TYPE: DEVPROPTYPE = DEVPROP_TYPE_STRING_LIST;\n\n    fn create_sized(bytes: usize) -> Self {\n        assert_eq!(bytes % size_of::<u16>(), 0);\n        U16StringList(vec![0u16; bytes / size_of::<u16>()])\n    }\n\n    fn as_ptr_mut(&mut self) -> *mut u8 {\n        self.0.as_mut_ptr() as _\n    }\n\n    fn validate(&self) {\n        assert!(\n            self.0.last().is_some_and(is_null),\n            \"Slice is not null terminated\"\n        );\n    }\n}\n\nimpl U16StringList {\n    pub fn iter(&self) -> impl Iterator<Item = &U16Str> {\n        U16Str::from_slice_list(self.0.as_slice())\n    }\n    pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut U16Str> {\n        U16Str::from_slice_list_mut(self.0.as_mut_slice())\n    }\n}\n\nfn is_null(c: &u16) -> bool {\n    *c == 0\n}\n"
  },
  {
    "path": "src/windows_native/types.rs",
    "content": "use crate::windows_native::error::{WinError, WinResult};\nuse crate::BusType;\nuse std::mem::{size_of, zeroed};\nuse std::ptr::null;\nuse windows_sys::core::GUID;\nuse windows_sys::Win32::Devices::Properties::{DEVPROPTYPE, DEVPROP_TYPE_GUID};\nuse windows_sys::Win32::Foundation::{\n    CloseHandle, DEVPROPKEY, FALSE, HANDLE, INVALID_HANDLE_VALUE, PROPERTYKEY, TRUE,\n};\nuse windows_sys::Win32::System::Threading::{CreateEventW, INFINITE};\nuse windows_sys::Win32::System::IO::{GetOverlappedResultEx, OVERLAPPED};\n\n#[allow(clippy::missing_safety_doc)]\npub unsafe trait DeviceProperty {\n    const TYPE: DEVPROPTYPE;\n    fn create_sized(bytes: usize) -> Self;\n    fn as_ptr_mut(&mut self) -> *mut u8;\n    fn validate(&self) {}\n}\n\nunsafe impl DeviceProperty for GUID {\n    const TYPE: DEVPROPTYPE = DEVPROP_TYPE_GUID;\n\n    fn create_sized(bytes: usize) -> Self {\n        assert_eq!(bytes, size_of::<GUID>());\n        GUID::from_u128(0)\n    }\n\n    fn as_ptr_mut(&mut self) -> *mut u8 {\n        (self as *mut GUID) as *mut u8\n    }\n}\n\npub trait PropertyKey: Copy {\n    fn as_ptr(&self) -> *const DEVPROPKEY;\n}\n\nimpl PropertyKey for DEVPROPKEY {\n    fn as_ptr(&self) -> *const DEVPROPKEY {\n        self\n    }\n}\n\nimpl PropertyKey for PROPERTYKEY {\n    fn as_ptr(&self) -> *const DEVPROPKEY {\n        self as *const PROPERTYKEY as _\n    }\n}\n\n#[derive(Debug, Copy, Clone, PartialEq, Eq)]\npub enum InternalBusType {\n    Unknown,\n    Usb,\n    Bluetooth,\n    BluetoothLE,\n    I2c,\n    Spi,\n}\n\nimpl From<InternalBusType> for BusType {\n    fn from(value: InternalBusType) -> Self {\n        match value {\n            InternalBusType::Unknown => BusType::Unknown,\n            InternalBusType::Usb => BusType::Usb,\n            InternalBusType::Bluetooth => BusType::Bluetooth,\n            InternalBusType::BluetoothLE => BusType::Bluetooth,\n            InternalBusType::I2c => BusType::I2c,\n            InternalBusType::Spi => BusType::Spi,\n        }\n    }\n}\n\npub struct Handle(HANDLE);\n\nimpl Handle {\n    pub fn from_raw(handle: HANDLE) -> Self {\n        Self(handle)\n    }\n    pub fn as_raw(&self) -> HANDLE {\n        self.0\n    }\n}\n\nimpl Drop for Handle {\n    fn drop(&mut self) {\n        if self.0 != INVALID_HANDLE_VALUE {\n            unsafe {\n                CloseHandle(self.0);\n            }\n        }\n        self.0 = INVALID_HANDLE_VALUE;\n    }\n}\n\npub struct Overlapped(OVERLAPPED);\n\nimpl Overlapped {\n    pub fn event_handle(&self) -> HANDLE {\n        self.0.hEvent\n    }\n    pub fn as_raw(&mut self) -> *mut OVERLAPPED {\n        &mut self.0\n    }\n\n    pub fn get_result(&mut self, handle: &Handle, timeout: Option<u32>) -> WinResult<usize> {\n        let mut bytes_written = 0;\n        let cr = unsafe {\n            GetOverlappedResultEx(\n                handle.as_raw(),\n                self.as_raw(),\n                &mut bytes_written,\n                timeout.unwrap_or(INFINITE),\n                FALSE,\n            )\n        };\n        ensure!(cr == TRUE, Err(WinError::last()));\n        Ok(bytes_written as usize)\n    }\n}\n\nunsafe impl Send for Overlapped {}\n\nimpl Default for Overlapped {\n    fn default() -> Self {\n        Overlapped(unsafe {\n            OVERLAPPED {\n                //todo check if event is null\n                hEvent: CreateEventW(null(), FALSE, FALSE, null()),\n                ..zeroed()\n            }\n        })\n    }\n}\n\nimpl Drop for Overlapped {\n    fn drop(&mut self) {\n        if self.0.hEvent != INVALID_HANDLE_VALUE {\n            unsafe {\n                CloseHandle(self.0.hEvent);\n            }\n        }\n        self.0.hEvent = INVALID_HANDLE_VALUE;\n    }\n}\n"
  },
  {
    "path": "src/windows_native/utils.rs",
    "content": "pub trait PeakIterExt<T: Iterator> {\n    fn peaking(self) -> PeakingIter<T>;\n}\n\nimpl<T: Iterator> PeakIterExt<T> for T {\n    fn peaking(mut self) -> PeakingIter<T> {\n        PeakingIter {\n            next: self.next(),\n            inner: self,\n        }\n    }\n}\n\npub struct PeakingIter<T: Iterator> {\n    inner: T,\n    next: Option<T::Item>,\n}\n\nimpl<T: Copy, I: Iterator<Item = T>> Iterator for PeakingIter<I> {\n    type Item = (I::Item, Option<I::Item>);\n\n    fn next(&mut self) -> Option<Self::Item> {\n        let current = self.next.take();\n        self.next = self.inner.next();\n        current.map(|v| (v, self.next))\n    }\n}\n"
  },
  {
    "path": "tests/pp_data/045E_02FF_0005_0001.expected",
    "content": "0x05, 0x01, 0x09, 0x05, 0xA1, 0x01, 0x09, 0x00, 0xA1, 0x00, \n0x09, 0x30, 0x09, 0x31, 0x15, 0x00, 0x25, 0xFF, 0x35, 0x00, \n0x45, 0xFF, 0x75, 0x10, 0x95, 0x02, 0x81, 0x02, 0xC0, 0x09, \n0x00, 0xA1, 0x00, 0x09, 0x33, 0x09, 0x34, 0x15, 0x00, 0x25, \n0xFF, 0x75, 0x10, 0x95, 0x02, 0x81, 0x02, 0xC0, 0x09, 0x00, \n0xA1, 0x00, 0x09, 0x32, 0x15, 0x00, 0x25, 0xFF, 0x75, 0x10, \n0x95, 0x01, 0x81, 0x02, 0xC0, 0x05, 0x09, 0x19, 0x01, 0x29, \n0x10, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x10, 0x45, \n0x00, 0x81, 0x02, 0x05, 0x01, 0x09, 0x39, 0x15, 0x01, 0x25, \n0x08, 0x35, 0x00, 0x46, 0x3B, 0x10, 0x65, 0x0E, 0x75, 0x04, \n0x95, 0x01, 0x81, 0x42, 0x75, 0x04, 0x95, 0x01, 0x81, 0x03, \n0xC0, "
  },
  {
    "path": "tests/pp_data/045E_02FF_0005_0001.pp_data",
    "content": "0x48, 0x69, 0x64, 0x50, 0x20, 0x4B, 0x44, 0x52, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00,\n0x07, 0x00, 0x10, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,\n0xD8, 0x02, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x03, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x05, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,\n0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00,\n0x07, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF,\n0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,\n0x10, 0x00, 0x01, 0x00, 0x05, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x33, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x09, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x03, 0x00,\n0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x32, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x0B, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x0D, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x14, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x0D, 0x00, 0x04, 0x00,\n0x42, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x15, 0x00, 0x15, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x3B, 0x10, 0x00, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00,\n0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,"
  },
  {
    "path": "tests/pp_data/046A_0011_0006_0001.expected",
    "content": "0x05, 0x01, 0x09, 0x06, 0xA1, 0x01, 0x05, 0x07, 0x19, 0xE0, \n0x29, 0xE7, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x08, \n0x81, 0x02, 0x75, 0x08, 0x95, 0x01, 0x81, 0x03, 0x19, 0x00, \n0x29, 0xDD, 0x15, 0x00, 0x26, 0xDD, 0x00, 0x75, 0x08, 0x95, \n0x06, 0x81, 0x00, 0x05, 0x08, 0x19, 0x01, 0x29, 0x03, 0x15, \n0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x03, 0x91, 0x02, 0x75, \n0x05, 0x95, 0x01, 0x91, 0x03, 0xC0, "
  },
  {
    "path": "tests/pp_data/046A_0011_0006_0001.pp_data",
    "content": "0x48, 0x69, 0x64, 0x50, 0x20, 0x4B, 0x44, 0x52, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,\n0x02, 0x00, 0x09, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,\n0x38, 0x01, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x03, 0x00, 0x30, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x08, 0x00, 0xE5, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00,\n0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x1C, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,"
  },
  {
    "path": "tests/pp_data/046D_0A37_0001_000C.expected",
    "content": "0x05, 0x0C, 0x09, 0x01, 0xA1, 0x01, 0x85, 0x01, 0x09, 0xE9, \n0x09, 0xEA, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x02, \n0x81, 0x02, 0x09, 0xE2, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, \n0x95, 0x01, 0x81, 0x06, 0x75, 0x02, 0x95, 0x01, 0x81, 0x03, \n0x09, 0x36, 0xA1, 0x02, 0x05, 0x09, 0x19, 0x01, 0x29, 0x02, \n0x15, 0x01, 0x25, 0x02, 0x75, 0x02, 0x95, 0x01, 0x81, 0x40, \n0x75, 0x01, 0x95, 0x01, 0x81, 0x03, 0xC0, 0x85, 0x02, 0x05, \n0x0C, 0x09, 0x00, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, \n0x10, 0x81, 0x02, 0x85, 0x05, 0x09, 0x00, 0x15, 0x00, 0x25, \n0x01, 0x75, 0x08, 0x95, 0x20, 0x81, 0x02, 0x85, 0x07, 0x09, \n0x00, 0x15, 0x00, 0x25, 0x01, 0x75, 0x08, 0x95, 0x20, 0x81, \n0x02, 0x85, 0x03, 0x09, 0x00, 0x15, 0x00, 0x25, 0x01, 0x75, \n0x01, 0x95, 0x10, 0x91, 0x02, 0x85, 0x04, 0x09, 0x00, 0x15, \n0x00, 0x25, 0x01, 0x75, 0x08, 0x95, 0x24, 0x91, 0x02, 0x85, \n0x06, 0x09, 0x00, 0x15, 0x00, 0x25, 0x01, 0x75, 0x08, 0x95, \n0x24, 0x91, 0x02, 0xC0, "
  },
  {
    "path": "tests/pp_data/046D_0A37_0001_000C.pp_data",
    "content": "0x48, 0x69, 0x64, 0x50, 0x20, 0x4B, 0x44, 0x52, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00,\n0x07, 0x00, 0x21, 0x00, 0x09, 0x00, 0x03, 0x00, 0x0C, 0x00, 0x25, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00,\n0xE0, 0x04, 0x02, 0x00, 0x0C, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xEA, 0x00, 0xEA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x00, 0xE9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x02, 0x01, 0x00, 0x01, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE2, 0x00, 0xE2, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x05,\n0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x40, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x0C, 0x00, 0x36, 0x00,\n0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x0C, 0x00, 0x02, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,\n0x0C, 0x00, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x05, 0x00, 0x08, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00,\n0x21, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x01,\n0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0x0C, 0x00, 0x03, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,\n0x0C, 0x00, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x24, 0x00, 0x01, 0x00, 0x20, 0x01, 0x02, 0x00, 0x00, 0x00,\n0x25, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x08, 0x00, 0x24, 0x00, 0x01, 0x00, 0x20, 0x01,\n0x02, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x01, 0x00,\n0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x36, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x00, 0x00,"
  },
  {
    "path": "tests/pp_data/046D_B010_0001_000C.expected",
    "content": "0x05, 0x0C, 0x09, 0x01, 0xA1, 0x01, 0x85, 0x03, 0x05, 0x06, \n0x09, 0x20, 0x15, 0x00, 0x25, 0x64, 0x75, 0x08, 0x95, 0x01, \n0x81, 0x02, 0xC0, "
  },
  {
    "path": "tests/pp_data/046D_B010_0001_000C.pp_data",
    "content": "0x48, 0x69, 0x64, 0x50, 0x20, 0x4B, 0x44, 0x52, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,\n0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,\n0x68, 0x00, 0x01, 0x00, 0x06, 0x00, 0x03, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0x00, 0x00, 0x00,"
  },
  {
    "path": "tests/pp_data/046D_B010_0001_FF00.expected",
    "content": "0x06, 0x00, 0xFF, 0x09, 0x01, 0xA1, 0x01, 0x85, 0x10, 0x09, \n0x01, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, 0x08, 0x95, 0x06, \n0x81, 0x00, 0x09, 0x01, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, \n0x08, 0x95, 0x06, 0x91, 0x00, 0xC0, "
  },
  {
    "path": "tests/pp_data/046D_B010_0001_FF00.pp_data",
    "content": "0x48, 0x69, 0x64, 0x50, 0x20, 0x4B, 0x44, 0x52, 0x01, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,\n0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,\n0xD0, 0x00, 0x01, 0x00, 0x00, 0xFF, 0x10, 0x00, 0x08, 0x00, 0x06, 0x00, 0x01, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x07, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x10, 0x00, 0x08, 0x00, 0x06, 0x00, 0x01, 0x00, 0x30, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,"
  },
  {
    "path": "tests/pp_data/046D_B010_0002_0001.expected",
    "content": "0x05, 0x01, 0x09, 0x02, 0xA1, 0x01, 0x09, 0x01, 0xA1, 0x00, \n0x85, 0x02, 0x05, 0x09, 0x19, 0x01, 0x29, 0x08, 0x15, 0x00, \n0x25, 0x01, 0x75, 0x01, 0x95, 0x08, 0x81, 0x02, 0x05, 0x01, \n0x09, 0x30, 0x09, 0x31, 0x16, 0x01, 0xF8, 0x26, 0xFF, 0x07, \n0x75, 0x0C, 0x95, 0x02, 0x81, 0x06, 0x09, 0x38, 0x15, 0x81, \n0x25, 0x7F, 0x75, 0x08, 0x95, 0x01, 0x81, 0x06, 0x05, 0x0C, \n0x0A, 0x38, 0x02, 0x15, 0x81, 0x25, 0x7F, 0x75, 0x08, 0x95, \n0x01, 0x81, 0x06, 0xC0, 0xC0, "
  },
  {
    "path": "tests/pp_data/046D_B010_0002_0001.pp_data",
    "content": "0x48, 0x69, 0x64, 0x50, 0x20, 0x4B, 0x44, 0x52, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,\n0x05, 0x00, 0x07, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,\n0x08, 0x02, 0x02, 0x00, 0x09, 0x00, 0x02, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x04, 0x0C, 0x00, 0x01, 0x00, 0x03, 0x00, 0x0C, 0x00,\n0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x01, 0x00,\n0x02, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x05, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x38, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0xFF, 0xFF, 0xFF,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x0C, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 0x06, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x38, 0x02, 0x38, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,"
  },
  {
    "path": "tests/pp_data/046D_B010_0002_FF00.expected",
    "content": "0x06, 0x00, 0xFF, 0x09, 0x02, 0xA1, 0x01, 0x85, 0x11, 0x09, \n0x02, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, 0x08, 0x95, 0x13, \n0x81, 0x00, 0x09, 0x02, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, \n0x08, 0x95, 0x13, 0x91, 0x00, 0xC0, "
  },
  {
    "path": "tests/pp_data/046D_B010_0002_FF00.pp_data",
    "content": "0x48, 0x69, 0x64, 0x50, 0x20, 0x4B, 0x44, 0x52, 0x02, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,\n0x01, 0x00, 0x14, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x14, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,\n0xD0, 0x00, 0x01, 0x00, 0x00, 0xFF, 0x11, 0x00, 0x08, 0x00, 0x13, 0x00, 0x01, 0x00, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x14, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x02, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x11, 0x00, 0x08, 0x00, 0x13, 0x00, 0x01, 0x00, 0x98, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x02, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,"
  },
  {
    "path": "tests/pp_data/046D_B010_0006_0001.expected",
    "content": "0x05, 0x01, 0x09, 0x06, 0xA1, 0x01, 0x85, 0x04, 0x05, 0x07, \n0x19, 0xE0, 0x29, 0xE7, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, \n0x95, 0x08, 0x81, 0x02, 0x75, 0x08, 0x95, 0x01, 0x81, 0x03, \n0x19, 0x00, 0x29, 0xFF, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, \n0x08, 0x95, 0x06, 0x81, 0x00, 0x05, 0x08, 0x19, 0x01, 0x29, \n0x05, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x05, 0x91, \n0x02, 0x75, 0x03, 0x95, 0x01, 0x91, 0x03, 0xC0, "
  },
  {
    "path": "tests/pp_data/046D_B010_0006_0001.pp_data",
    "content": "0x48, 0x69, 0x64, 0x50, 0x20, 0x4B, 0x44, 0x52, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,\n0x02, 0x00, 0x09, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,\n0x38, 0x01, 0x01, 0x00, 0x07, 0x00, 0x04, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x04, 0x00, 0x08, 0x00, 0x06, 0x00, 0x03, 0x00, 0x30, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x08, 0x00, 0x07, 0x01, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00, 0x01, 0x00, 0x05, 0x00,\n0x01, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x1C, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,"
  },
  {
    "path": "tests/pp_data/046D_C077_0002_0001.expected",
    "content": "0x05, 0x01, 0x09, 0x02, 0xA1, 0x01, 0x09, 0x01, 0xA1, 0x00, \n0x05, 0x09, 0x19, 0x01, 0x29, 0x03, 0x15, 0x00, 0x25, 0x01, \n0x75, 0x01, 0x95, 0x08, 0x81, 0x02, 0x05, 0x01, 0x09, 0x30, \n0x09, 0x31, 0x09, 0x38, 0x15, 0x81, 0x25, 0x7F, 0x75, 0x08, \n0x95, 0x03, 0x81, 0x06, 0xC0, 0xC0, "
  },
  {
    "path": "tests/pp_data/046D_C077_0002_0001.pp_data",
    "content": "0x48, 0x69, 0x64, 0x50, 0x20, 0x4B, 0x44, 0x52, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00,\n0x04, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,\n0xA0, 0x01, 0x02, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x04, 0x00, 0x08, 0x00,\n0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x03, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x02, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0xFF, 0xFF, 0xFF,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,"
  },
  {
    "path": "tests/pp_data/046D_C283_0004_0001.expected",
    "content": "0x05, 0x01, 0x09, 0x04, 0xA1, 0x01, 0x09, 0x00, 0xA1, 0x02, \n0x09, 0x01, 0xA1, 0x00, 0x09, 0x30, 0x09, 0x31, 0x15, 0x00, \n0x26, 0xFF, 0x00, 0x35, 0x00, 0x46, 0xFF, 0x00, 0x75, 0x08, \n0x95, 0x02, 0x81, 0x02, 0x06, 0x00, 0xFF, 0x09, 0x01, 0x15, \n0x00, 0x25, 0x0F, 0x75, 0x04, 0x95, 0x01, 0x81, 0x02, 0x05, \n0x01, 0x09, 0x39, 0x15, 0x00, 0x25, 0x07, 0x35, 0x00, 0x46, \n0x3B, 0x01, 0x65, 0x14, 0x75, 0x04, 0x95, 0x01, 0x81, 0x42, \n0x09, 0x35, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x35, 0x00, 0x46, \n0xFF, 0x00, 0x75, 0x08, 0x95, 0x01, 0x81, 0x02, 0xC0, 0x05, \n0x09, 0x19, 0x01, 0x29, 0x07, 0x15, 0x00, 0x25, 0x01, 0x75, \n0x01, 0x95, 0x07, 0x45, 0x00, 0x65, 0x00, 0x81, 0x02, 0x75, \n0x01, 0x95, 0x01, 0x81, 0x03, 0x05, 0x01, 0x09, 0x36, 0x15, \n0x00, 0x26, 0xFF, 0x00, 0x35, 0x00, 0x46, 0xFF, 0x00, 0x75, \n0x08, 0x95, 0x01, 0x81, 0x02, 0x06, 0x00, 0xFF, 0x09, 0x01, \n0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, 0x08, 0x95, 0x01, 0x81, \n0x02, 0xC0, 0x09, 0x00, 0xA1, 0x02, 0x09, 0x02, 0x15, 0x00, \n0x26, 0xFF, 0x00, 0x75, 0x08, 0x95, 0x08, 0x91, 0x02, 0xC0, \n0xC0, "
  },
  {
    "path": "tests/pp_data/046D_C283_0004_0001.pp_data",
    "content": "0x48, 0x69, 0x64, 0x50, 0x20, 0x4B, 0x44, 0x52, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,\n0x08, 0x00, 0x08, 0x00, 0x08, 0x00, 0x01, 0x00, 0x09, 0x00, 0x09, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,\n0xA8, 0x03, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x03, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00,\n0x03, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x04,\n0x04, 0x00, 0x01, 0x00, 0x03, 0x00, 0x04, 0x00, 0x42, 0x00, 0x00, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x39, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0x01, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x04, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x02, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x35, 0x00, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x07, 0x00, 0x05, 0x00, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x06, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x0B, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x06, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x07, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00,\n0x08, 0x00, 0x08, 0x00, 0x01, 0x00, 0x40, 0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x03, 0x00, 0x00, 0xFF, 0x00, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x04, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,\n0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x00, 0x00,"
  },
  {
    "path": "tests/pp_data/046D_C52F_0001_000C.expected",
    "content": "0x05, 0x0C, 0x09, 0x01, 0xA1, 0x01, 0x85, 0x03, 0x19, 0x01, \n0x2A, 0x8C, 0x02, 0x15, 0x01, 0x26, 0x8C, 0x02, 0x75, 0x10, \n0x95, 0x02, 0x81, 0x00, 0xC0, "
  },
  {
    "path": "tests/pp_data/046D_C52F_0001_000C.pp_data",
    "content": "0x48, 0x69, 0x64, 0x50, 0x20, 0x4B, 0x44, 0x52, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,\n0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,\n0x68, 0x00, 0x01, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x10, 0x00, 0x02, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x05, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8B, 0x02,\n0x01, 0x00, 0x00, 0x00, 0x8C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0x00, 0x00, 0x00,"
  },
  {
    "path": "tests/pp_data/046D_C52F_0001_FF00.expected",
    "content": "0x06, 0x00, 0xFF, 0x09, 0x01, 0xA1, 0x01, 0x85, 0x10, 0x09, \n0x01, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, 0x08, 0x95, 0x06, \n0x81, 0x00, 0x09, 0x01, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, \n0x08, 0x95, 0x06, 0x91, 0x00, 0xC0, "
  },
  {
    "path": "tests/pp_data/046D_C52F_0001_FF00.pp_data",
    "content": "0x48, 0x69, 0x64, 0x50, 0x20, 0x4B, 0x44, 0x52, 0x01, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,\n0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,\n0xD0, 0x00, 0x01, 0x00, 0x00, 0xFF, 0x10, 0x00, 0x08, 0x00, 0x06, 0x00, 0x01, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x07, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x10, 0x00, 0x08, 0x00, 0x06, 0x00, 0x01, 0x00, 0x30, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,"
  },
  {
    "path": "tests/pp_data/046D_C52F_0002_0001.expected",
    "content": "0x05, 0x01, 0x09, 0x02, 0xA1, 0x01, 0x09, 0x01, 0xA1, 0x00, \n0x05, 0x09, 0x19, 0x01, 0x29, 0x10, 0x15, 0x00, 0x25, 0x01, \n0x75, 0x01, 0x95, 0x10, 0x81, 0x02, 0x05, 0x01, 0x09, 0x30, \n0x09, 0x31, 0x16, 0x01, 0x80, 0x26, 0xFF, 0x7F, 0x75, 0x10, \n0x95, 0x02, 0x81, 0x06, 0x09, 0x38, 0x15, 0x81, 0x25, 0x7F, \n0x75, 0x08, 0x95, 0x01, 0x81, 0x06, 0x05, 0x0C, 0x0A, 0x38, \n0x02, 0x15, 0x81, 0x25, 0x7F, 0x75, 0x08, 0x95, 0x01, 0x81, \n0x06, 0xC0, 0xC0, "
  },
  {
    "path": "tests/pp_data/046D_C52F_0002_0001.pp_data",
    "content": "0x48, 0x69, 0x64, 0x50, 0x20, 0x4B, 0x44, 0x52, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,\n0x05, 0x00, 0x09, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,\n0x08, 0x02, 0x02, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x03, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00, 0x05, 0x00, 0x10, 0x00,\n0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x10, 0x00, 0x01, 0x00,\n0x03, 0x00, 0x10, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x80, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x07, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x38, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0xFF, 0xFF, 0xFF,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x0C, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x38, 0x02, 0x38, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,"
  },
  {
    "path": "tests/pp_data/046D_C52F_0002_FF00.expected",
    "content": "0x06, 0x00, 0xFF, 0x09, 0x02, 0xA1, 0x01, 0x85, 0x11, 0x09, \n0x02, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, 0x08, 0x95, 0x13, \n0x81, 0x00, 0x09, 0x02, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, \n0x08, 0x95, 0x13, 0x91, 0x00, 0xC0, "
  },
  {
    "path": "tests/pp_data/046D_C52F_0002_FF00.pp_data",
    "content": "0x48, 0x69, 0x64, 0x50, 0x20, 0x4B, 0x44, 0x52, 0x02, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,\n0x01, 0x00, 0x14, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x14, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,\n0xD0, 0x00, 0x01, 0x00, 0x00, 0xFF, 0x11, 0x00, 0x08, 0x00, 0x13, 0x00, 0x01, 0x00, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x14, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x02, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x11, 0x00, 0x08, 0x00, 0x13, 0x00, 0x01, 0x00, 0x98, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x02, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,"
  },
  {
    "path": "tests/pp_data/046D_C534_0001_000C.expected",
    "content": "0x05, 0x0C, 0x09, 0x01, 0xA1, 0x01, 0x85, 0x03, 0x19, 0x01, \n0x2A, 0x8C, 0x02, 0x15, 0x01, 0x26, 0x8C, 0x02, 0x75, 0x10, \n0x95, 0x02, 0x81, 0x00, 0xC0, "
  },
  {
    "path": "tests/pp_data/046D_C534_0001_000C.pp_data",
    "content": "0x48, 0x69, 0x64, 0x50, 0x20, 0x4B, 0x44, 0x52, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,\n0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,\n0x68, 0x00, 0x01, 0x00, 0x0C, 0x00, 0x03, 0x00, 0x10, 0x00, 0x02, 0x00, 0x01, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x05, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x8C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8B, 0x02,\n0x01, 0x00, 0x00, 0x00, 0x8C, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0x00, 0x00, 0x00,"
  },
  {
    "path": "tests/pp_data/046D_C534_0001_FF00.expected",
    "content": "0x06, 0x00, 0xFF, 0x09, 0x01, 0xA1, 0x01, 0x85, 0x10, 0x09, \n0x01, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, 0x08, 0x95, 0x06, \n0x81, 0x00, 0x09, 0x01, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, \n0x08, 0x95, 0x06, 0x91, 0x00, 0xC0, "
  },
  {
    "path": "tests/pp_data/046D_C534_0001_FF00.pp_data",
    "content": "0x48, 0x69, 0x64, 0x50, 0x20, 0x4B, 0x44, 0x52, 0x01, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,\n0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x07, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,\n0xD0, 0x00, 0x01, 0x00, 0x00, 0xFF, 0x10, 0x00, 0x08, 0x00, 0x06, 0x00, 0x01, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x07, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x10, 0x00, 0x08, 0x00, 0x06, 0x00, 0x01, 0x00, 0x30, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,"
  },
  {
    "path": "tests/pp_data/046D_C534_0002_0001.expected",
    "content": "0x05, 0x01, 0x09, 0x02, 0xA1, 0x01, 0x09, 0x01, 0xA1, 0x00, \n0x85, 0x02, 0x05, 0x09, 0x19, 0x01, 0x29, 0x10, 0x15, 0x00, \n0x25, 0x01, 0x75, 0x01, 0x95, 0x10, 0x81, 0x02, 0x05, 0x01, \n0x09, 0x30, 0x09, 0x31, 0x16, 0x01, 0xF8, 0x26, 0xFF, 0x07, \n0x75, 0x0C, 0x95, 0x02, 0x81, 0x06, 0x09, 0x38, 0x15, 0x81, \n0x25, 0x7F, 0x75, 0x08, 0x95, 0x01, 0x81, 0x06, 0x05, 0x0C, \n0x0A, 0x38, 0x02, 0x15, 0x81, 0x25, 0x7F, 0x75, 0x08, 0x95, \n0x01, 0x81, 0x06, 0xC0, 0xC0, "
  },
  {
    "path": "tests/pp_data/046D_C534_0002_0001.pp_data",
    "content": "0x48, 0x69, 0x64, 0x50, 0x20, 0x4B, 0x44, 0x52, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,\n0x05, 0x00, 0x08, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,\n0x08, 0x02, 0x02, 0x00, 0x09, 0x00, 0x02, 0x00, 0x01, 0x00, 0x10, 0x00, 0x01, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x03, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x04, 0x0C, 0x00, 0x01, 0x00, 0x04, 0x00, 0x0C, 0x00,\n0x06, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x0C, 0x00, 0x01, 0x00,\n0x03, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xF8, 0xFF, 0xFF, 0xFF, 0x07, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x06, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x38, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0xFF, 0xFF, 0xFF,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x0C, 0x00, 0x02, 0x00, 0x08, 0x00, 0x01, 0x00, 0x07, 0x00, 0x08, 0x00, 0x06, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x38, 0x02, 0x38, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0xFF, 0xFF, 0xFF, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,"
  },
  {
    "path": "tests/pp_data/046D_C534_0002_FF00.expected",
    "content": "0x06, 0x00, 0xFF, 0x09, 0x02, 0xA1, 0x01, 0x85, 0x11, 0x09, \n0x02, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, 0x08, 0x95, 0x13, \n0x81, 0x00, 0x09, 0x02, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, \n0x08, 0x95, 0x13, 0x91, 0x00, 0xC0, "
  },
  {
    "path": "tests/pp_data/046D_C534_0002_FF00.pp_data",
    "content": "0x48, 0x69, 0x64, 0x50, 0x20, 0x4B, 0x44, 0x52, 0x02, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00,\n0x01, 0x00, 0x14, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x14, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,\n0xD0, 0x00, 0x01, 0x00, 0x00, 0xFF, 0x11, 0x00, 0x08, 0x00, 0x13, 0x00, 0x01, 0x00, 0x98, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x14, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x02, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x11, 0x00, 0x08, 0x00, 0x13, 0x00, 0x01, 0x00, 0x98, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x02, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,"
  },
  {
    "path": "tests/pp_data/046D_C534_0006_0001.expected",
    "content": "0x05, 0x01, 0x09, 0x06, 0xA1, 0x01, 0x05, 0x07, 0x19, 0xE0, \n0x29, 0xE7, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x08, \n0x81, 0x02, 0x75, 0x08, 0x95, 0x01, 0x81, 0x03, 0x19, 0x00, \n0x29, 0xA4, 0x15, 0x00, 0x26, 0xA4, 0x00, 0x75, 0x08, 0x95, \n0x06, 0x81, 0x00, 0x05, 0x08, 0x19, 0x01, 0x29, 0x05, 0x15, \n0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x05, 0x91, 0x02, 0x75, \n0x03, 0x95, 0x01, 0x91, 0x03, 0xC0, "
  },
  {
    "path": "tests/pp_data/046D_C534_0006_0001.pp_data",
    "content": "0x48, 0x69, 0x64, 0x50, 0x20, 0x4B, 0x44, 0x52, 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,\n0x02, 0x00, 0x09, 0x00, 0x02, 0x00, 0x01, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,\n0x38, 0x01, 0x01, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xE0, 0x00, 0xE7, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x08, 0x00, 0x06, 0x00, 0x03, 0x00, 0x30, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x08, 0x00, 0xAC, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA4, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00,\n0x01, 0x00, 0x05, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x1C, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,"
  },
  {
    "path": "tests/pp_data/046D_C534_0080_0001.expected",
    "content": "0x05, 0x01, 0x09, 0x80, 0xA1, 0x01, 0x85, 0x04, 0x09, 0x82, \n0x09, 0x81, 0x09, 0x83, 0x15, 0x01, 0x25, 0x03, 0x75, 0x02, \n0x95, 0x01, 0x81, 0x60, 0x75, 0x06, 0x95, 0x01, 0x81, 0x03, \n0xC0, "
  },
  {
    "path": "tests/pp_data/046D_C534_0080_0001.pp_data",
    "content": "0x48, 0x69, 0x64, 0x50, 0x20, 0x4B, 0x44, 0x52, 0x80, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x80, 0x00, 0x00, 0x03, 0x00,\n0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,\n0x38, 0x01, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x60, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x83, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00,\n0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00,\n0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00,\n0x01, 0x00, 0x02, 0x00, 0x60, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, 0x80, 0x00, 0x0C, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,"
  },
  {
    "path": "tests/pp_data/047F_C056_0001_000C.expected",
    "content": "0x05, 0x0C, 0x09, 0x01, 0xA1, 0x01, 0x85, 0x01, 0x09, 0xE9, \n0x09, 0xEA, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x02, \n0x81, 0x06, 0x75, 0x06, 0x95, 0x01, 0x81, 0x03, 0x85, 0x02, \n0x09, 0x00, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x10, \n0x81, 0x02, 0x85, 0x05, 0x09, 0x00, 0x15, 0x00, 0x25, 0x01, \n0x75, 0x08, 0x95, 0x20, 0x81, 0x02, 0x85, 0x07, 0x09, 0x00, \n0x15, 0x00, 0x25, 0x01, 0x75, 0x08, 0x95, 0x20, 0x81, 0x02, \n0x85, 0x04, 0x09, 0x00, 0x15, 0x00, 0x25, 0x01, 0x75, 0x08, \n0x95, 0x24, 0x91, 0x02, 0x85, 0x06, 0x09, 0x00, 0x15, 0x00, \n0x25, 0x01, 0x75, 0x08, 0x95, 0x24, 0x91, 0x02, 0xC0, "
  },
  {
    "path": "tests/pp_data/047F_C056_0001_000C.pp_data",
    "content": "0x48, 0x69, 0x64, 0x50, 0x20, 0x4B, 0x44, 0x52, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00,\n0x05, 0x00, 0x21, 0x00, 0x05, 0x00, 0x02, 0x00, 0x07, 0x00, 0x25, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,\n0xD8, 0x02, 0x01, 0x00, 0x0C, 0x00, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xEA, 0x00, 0xEA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,\n0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE9, 0x00, 0xE9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x02, 0x00, 0x01, 0x00, 0x10, 0x00,\n0x01, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x05, 0x00,\n0x08, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x0C, 0x00, 0x07, 0x00, 0x08, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00,\n0x0C, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x04, 0x00, 0x08, 0x00, 0x24, 0x00, 0x01, 0x00, 0x20, 0x01, 0x02, 0x00, 0x00, 0x00,\n0x25, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x06, 0x00, 0x08, 0x00, 0x24, 0x00, 0x01, 0x00, 0x20, 0x01,\n0x02, 0x00, 0x00, 0x00, 0x25, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,"
  },
  {
    "path": "tests/pp_data/047F_C056_0003_FFA0.expected",
    "content": "0x06, 0xA0, 0xFF, 0x09, 0x03, 0xA1, 0x01, 0x85, 0x03, 0x09, \n0x30, 0x15, 0x00, 0x25, 0x01, 0x75, 0x08, 0x95, 0x20, 0x81, \n0x02, 0x85, 0x14, 0x09, 0xB1, 0x09, 0xB2, 0x09, 0xB5, 0x09, \n0xB7, 0x09, 0xB3, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, \n0x05, 0x81, 0x06, 0x75, 0x03, 0x95, 0x01, 0x81, 0x03, 0x85, \n0x15, 0x09, 0x8C, 0x15, 0x00, 0x27, 0xFF, 0xFF, 0x00, 0x00, \n0x75, 0x10, 0x95, 0x01, 0x81, 0x22, 0x85, 0x1F, 0x09, 0x9C, \n0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x06, \n0x75, 0x07, 0x95, 0x01, 0x81, 0x03, 0x85, 0x03, 0x09, 0x30, \n0x15, 0x00, 0x25, 0x01, 0x75, 0x08, 0x95, 0x20, 0x91, 0x02, \n0x85, 0x19, 0x09, 0x8D, 0x09, 0x8F, 0x09, 0x9E, 0x09, 0xDC, \n0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x04, 0x91, 0x22, \n0x09, 0xD2, 0x09, 0xD9, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, \n0x95, 0x02, 0x91, 0x06, 0x75, 0x02, 0x95, 0x01, 0x91, 0x03, \n0x85, 0x1A, 0x09, 0xB5, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, \n0x95, 0x01, 0x91, 0x22, 0x75, 0x07, 0x95, 0x01, 0x91, 0x03, \n0x85, 0x1B, 0x09, 0xCF, 0x09, 0xB5, 0x15, 0x00, 0x25, 0x01, \n0x75, 0x01, 0x95, 0x02, 0xB1, 0x22, 0x09, 0xDE, 0x15, 0x00, \n0x25, 0x01, 0x75, 0x01, 0x95, 0x01, 0xB1, 0x23, 0x09, 0xD8, \n0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x01, 0xB1, 0x22, \n0x75, 0x04, 0x95, 0x01, 0xB1, 0x03, 0x09, 0x09, 0x09, 0x17, \n0x09, 0x18, 0x09, 0x1E, 0x09, 0x20, 0x09, 0x2A, 0x15, 0x00, \n0x25, 0x01, 0x75, 0x01, 0x95, 0x06, 0xB1, 0x22, 0x75, 0x02, \n0x95, 0x01, 0xB1, 0x03, 0xC0, "
  },
  {
    "path": "tests/pp_data/047F_C056_0003_FFA0.pp_data",
    "content": "0x48, 0x69, 0x64, 0x50, 0x20, 0x4B, 0x44, 0x52, 0x03, 0x00, 0xA0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00,\n0x08, 0x00, 0x21, 0x00, 0x08, 0x00, 0x08, 0x00, 0x10, 0x00, 0x21, 0x00, 0x10, 0x00, 0x0A, 0x00, 0x1A, 0x00, 0x03, 0x00,\n0x90, 0x0A, 0x01, 0x00, 0xA0, 0xFF, 0x03, 0x00, 0x08, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00,\n0x21, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x03, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x14, 0x04, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,\n0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB3, 0x00, 0xB3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x14, 0x03, 0x01, 0x00, 0x01, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB7, 0x00, 0xB7, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x14, 0x02,\n0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x03, 0x00,\n0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x00, 0xB5, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xA0, 0xFF, 0x14, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,\n0xA0, 0xFF, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xB2, 0x00, 0xB2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x14, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xB1, 0x00, 0xB1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x15, 0x00, 0x10, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10, 0x00,\n0x22, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x03, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8C, 0x00, 0x8C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x1F, 0x00, 0x01, 0x00, 0x01, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9C, 0x00, 0x9C, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x03, 0x00,\n0x08, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x03, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xA0, 0xFF, 0x19, 0x03, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,\n0xA0, 0xFF, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xDC, 0x00, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x19, 0x02, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x22, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x9E, 0x00, 0x9E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x19, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,\n0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x00, 0x8F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x19, 0x00, 0x01, 0x00, 0x01, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8D, 0x00, 0x8D, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x19, 0x05,\n0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x03, 0x00,\n0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD9, 0x00, 0xD9, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xA0, 0xFF, 0x19, 0x04, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,\n0xA0, 0xFF, 0x03, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xD2, 0x00, 0xD2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x1A, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x22, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xB5, 0x00, 0xB5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x1B, 0x01, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,\n0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x00, 0xB5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x1B, 0x00, 0x01, 0x00, 0x01, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCF, 0x00, 0xCF, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x1B, 0x02,\n0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x23, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x03, 0x00,\n0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDE, 0x00, 0xDE, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xA0, 0xFF, 0x1B, 0x03, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,\n0xA0, 0xFF, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xD8, 0x00, 0xD8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x1B, 0x05, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x22, 0x00, 0x00, 0x00,\n0x03, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x1B, 0x04, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00,\n0x22, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x05, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x1B, 0x03, 0x01, 0x00, 0x01, 0x00,\n0x02, 0x00, 0x01, 0x00, 0x22, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x1B, 0x02,\n0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x22, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x03, 0x00,\n0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xA0, 0xFF, 0x1B, 0x01, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x22, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,\n0xA0, 0xFF, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x17, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x1B, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x01, 0x00, 0x22, 0x00, 0x00, 0x00,\n0x03, 0x00, 0x00, 0x00, 0xA0, 0xFF, 0x03, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x09, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0xA0, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0x00, 0x00, 0x00,"
  },
  {
    "path": "tests/pp_data/047F_C056_0005_000B.expected",
    "content": "0x05, 0x0B, 0x09, 0x05, 0xA1, 0x01, 0x85, 0x08, 0x09, 0x2F, \n0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, 0x01, 0x81, 0x06, \n0x09, 0x20, 0x09, 0x21, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, \n0x95, 0x02, 0x81, 0x22, 0x75, 0x05, 0x95, 0x01, 0x81, 0x03, \n0x85, 0x09, 0x05, 0x08, 0x09, 0x09, 0x15, 0x00, 0x25, 0x01, \n0x75, 0x01, 0x95, 0x01, 0x91, 0x22, 0x75, 0x07, 0x95, 0x01, \n0x91, 0x03, 0x85, 0x17, 0x09, 0x17, 0x15, 0x00, 0x25, 0x01, \n0x75, 0x01, 0x95, 0x01, 0x91, 0x22, 0x75, 0x07, 0x95, 0x01, \n0x91, 0x03, 0x85, 0x18, 0x09, 0x18, 0x15, 0x00, 0x25, 0x01, \n0x75, 0x01, 0x95, 0x01, 0x91, 0x22, 0x75, 0x07, 0x95, 0x01, \n0x91, 0x03, 0x85, 0x1E, 0x09, 0x1E, 0x15, 0x00, 0x25, 0x01, \n0x75, 0x01, 0x95, 0x01, 0x91, 0x22, 0x75, 0x07, 0x95, 0x01, \n0x91, 0x03, 0x85, 0x20, 0x09, 0x20, 0x15, 0x00, 0x25, 0x01, \n0x75, 0x01, 0x95, 0x01, 0x91, 0x22, 0x75, 0x07, 0x95, 0x01, \n0x91, 0x03, 0x85, 0x2A, 0x09, 0x2A, 0x15, 0x00, 0x25, 0x01, \n0x75, 0x01, 0x95, 0x01, 0x91, 0x22, 0x75, 0x07, 0x95, 0x01, \n0x91, 0x03, 0xC0, "
  },
  {
    "path": "tests/pp_data/047F_C056_0005_000B.pp_data",
    "content": "0x48, 0x69, 0x64, 0x50, 0x20, 0x4B, 0x44, 0x52, 0x05, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00,\n0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x06, 0x00, 0x09, 0x00, 0x02, 0x00, 0x09, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,\n0xA8, 0x03, 0x01, 0x00, 0x0B, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x05, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x08, 0x02, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,\n0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x05, 0x00, 0x0C, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x08, 0x01, 0x01, 0x00, 0x01, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x05, 0x00, 0x0C, 0xCD, 0xCD, 0xCD,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x09, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x05, 0x00,\n0x0C, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x09, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x08, 0x00, 0x17, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x0B, 0x00, 0x05, 0x00, 0x0C, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x17, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x18, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x22, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x05, 0x00, 0x0C, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x1E, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,\n0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x05, 0x00, 0x0C, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0x01, 0x00, 0x01, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x05, 0x00, 0x0C, 0xCD, 0xCD, 0xCD,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x2A, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x22, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x05, 0x00,\n0x0C, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x2A, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x05, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00,"
  },
  {
    "path": "tests/pp_data/17CC_1130_0000_FF01.expected",
    "content": "0x06, 0x01, 0xFF, 0x09, 0x00, 0xA1, 0x01, 0x09, 0x01, 0xA1, \n0x02, 0x85, 0x01, 0x09, 0x03, 0x09, 0x03, 0x09, 0x03, 0x09, \n0x03, 0x15, 0x00, 0x25, 0x0F, 0x75, 0x04, 0x95, 0x04, 0x81, \n0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, \n0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, \n0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, \n0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, \n0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, \n0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, \n0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, \n0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, \n0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, \n0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x02, 0x09, 0x0B, 0x09, \n0x0B, 0x09, 0x0B, 0x09, 0x0B, 0x09, 0x0B, 0x09, 0x0B, 0x09, \n0x0B, 0x09, 0x0B, 0x15, 0x00, 0x25, 0x01, 0x75, 0x01, 0x95, \n0x38, 0x81, 0x02, 0xC0, 0x09, 0x02, 0xA1, 0x02, 0x85, 0x02, \n0x09, 0x04, 0x09, 0x04, 0x09, 0x04, 0x09, 0x04, 0x09, 0x04, \n0x09, 0x04, 0x09, 0x04, 0x09, 0x04, 0x09, 0x04, 0x09, 0x04, \n0x09, 0x04, 0x09, 0x04, 0x09, 0x04, 0x09, 0x04, 0x09, 0x04, \n0x09, 0x04, 0x09, 0x04, 0x09, 0x04, 0x09, 0x04, 0x09, 0x04, \n0x09, 0x04, 0x09, 0x04, 0x09, 0x04, 0x09, 0x04, 0x09, 0x04, \n0x09, 0x04, 0x15, 0x00, 0x26, 0xFF, 0x0F, 0x75, 0x10, 0x95, \n0x1A, 0x81, 0x02, 0xC0, 0x09, 0x80, 0xA1, 0x02, 0x85, 0x80, \n0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, \n0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, \n0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, \n0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, \n0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, \n0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, \n0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, \n0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, \n0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, \n0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, \n0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, \n0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, \n0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, \n0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, \n0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, \n0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, \n0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, \n0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, \n0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x15, 0x00, \n0x25, 0x7F, 0x75, 0x08, 0x95, 0x5E, 0x91, 0x02, 0xC0, 0x09, \n0x80, 0xA1, 0x02, 0x85, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, \n0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, \n0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, \n0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, \n0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, \n0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, \n0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, \n0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, 0x81, 0x09, \n0x81, 0x09, 0x81, 0x09, 0x81, 0x15, 0x00, 0x25, 0x7F, 0x75, \n0x08, 0x95, 0x28, 0x91, 0x02, 0xC0, 0x09, 0xD0, 0xA1, 0x02, \n0x85, 0xD0, 0x09, 0xD1, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, \n0x08, 0x95, 0x20, 0xB1, 0x82, 0xC0, 0x09, 0xD0, 0xA1, 0x02, \n0x85, 0xD1, 0x09, 0xD1, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, \n0x08, 0x95, 0x20, 0xB1, 0x82, 0xC0, 0x09, 0xD0, 0xA1, 0x02, \n0x85, 0xD2, 0x09, 0xD1, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, \n0x08, 0x95, 0x20, 0xB1, 0x82, 0xC0, 0x09, 0xD0, 0xA1, 0x02, \n0x85, 0xD3, 0x09, 0xD1, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, \n0x08, 0x95, 0x20, 0xB1, 0x82, 0xC0, 0x09, 0xD0, 0xA1, 0x02, \n0x85, 0xD4, 0x09, 0xD1, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, \n0x08, 0x95, 0x20, 0xB1, 0x82, 0xC0, 0x09, 0xD0, 0xA1, 0x02, \n0x85, 0xD5, 0x09, 0xD1, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, \n0x08, 0x95, 0x20, 0xB1, 0x82, 0xC0, 0x09, 0xD0, 0xA1, 0x02, \n0x85, 0xD6, 0x09, 0xD1, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, \n0x08, 0x95, 0x20, 0xB1, 0x82, 0xC0, 0x09, 0xD0, 0xA1, 0x02, \n0x85, 0xD8, 0x09, 0xD1, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, \n0x08, 0x95, 0x20, 0xB1, 0x82, 0xC0, 0x09, 0xD0, 0xA1, 0x02, \n0x85, 0xD9, 0x09, 0xD1, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, \n0x08, 0x95, 0x20, 0xB1, 0x82, 0xC0, 0x09, 0xD0, 0xA1, 0x02, \n0x85, 0xF1, 0x09, 0xD1, 0x15, 0x00, 0x26, 0xFF, 0x00, 0x75, \n0x08, 0x95, 0x02, 0xB1, 0x82, 0xC0, 0x09, 0xD0, 0xA1, 0x02, \n0x85, 0xF3, 0x09, 0xD1, 0x15, 0x00, 0x25, 0x7F, 0x75, 0x08, \n0x95, 0x02, 0xB1, 0x82, 0xC0, 0xC0, "
  },
  {
    "path": "tests/pp_data/17CC_1130_0000_FF01.pp_data",
    "content": "0x48, 0x69, 0x64, 0x50, 0x20, 0x4B, 0x44, 0x52, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00,\n0x56, 0x00, 0x35, 0x00, 0x57, 0x00, 0x86, 0x00, 0xDD, 0x00, 0x5F, 0x00, 0xDD, 0x00, 0x0B, 0x00, 0xE8, 0x00, 0x21, 0x00, \n0x40, 0x5E, 0x10, 0x00, 0x01, 0xFF, 0x01, 0x04, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, \n0x03, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x04, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x04, 0x04, 0x00, 0x01, 0x00,\n0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x00, \n0x04, 0x00, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x01, 0x07, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00,\n0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x06, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x09, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x05, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x04, 0x01, 0x00, 0x01, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x03,\n0x01, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00,\n0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x01, 0x02, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00,\n0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x09, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x0A, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x0B, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x07, 0x01, 0x00, 0x01, 0x00,\n0x07, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x06,\n0x01, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00,\n0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x01, 0x05, 0x01, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x04, 0x01, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x0F, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x03, 0x01, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x02, 0x01, 0x00, 0x01, 0x00,\n0x07, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x01,\n0x01, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00,\n0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x07, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x07, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x07, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x06, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x15, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x05, 0x01, 0x00, 0x01, 0x00,\n0x06, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x04,\n0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00,\n0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x01, 0x03, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00,\n0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x02, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x07, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x19, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x06, 0x00, 0x01, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x1A, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00,\n0x06, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x07,\n0x01, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00,\n0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x01, 0x06, 0x01, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00,\n0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x05, 0x01, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x06, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x1E, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x04, 0x01, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x1F, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x03, 0x01, 0x00, 0x01, 0x00,\n0x05, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x02,\n0x01, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00,\n0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x01, 0x00,\n0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x05, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x06, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x23, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x07, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, \n0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x24, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x06, 0x01, 0x00, 0x01, 0x00,\n0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x05,\n0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00,\n0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x01, 0x04, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00,\n0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x03, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x05, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x28, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x02, 0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x29, 0x00, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00,\n0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x00,\n0x01, 0x00, 0x01, 0x00, 0x04, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, \n0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x2B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x01, 0x07, 0x01, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00,\n0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x06, 0x01, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x04, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x2D, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x05, 0x01, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x2E, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x04, 0x01, 0x00, 0x01, 0x00,\n0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x03,\n0x01, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00,\n0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x01, 0x02, 0x01, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00,\n0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x01, 0x01, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x04, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x32, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x03, 0x00, 0x01, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x33, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x07, 0x01, 0x00, 0x01, 0x00,\n0x09, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x06,\n0x01, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00,\n0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x0B, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x35, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x01, 0x05, 0x01, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x01, 0x00,\n0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x0B, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x04, 0x01, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x0A, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x00, 0x37, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x03, 0x01, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x38, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x02, 0x01, 0x00, 0x01, 0x00,\n0x09, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x01, 0x01,\n0x01, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x01, 0x00,\n0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x0B, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x09, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x01, 0x00,\n0x01, 0xFF, 0x01, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x0B, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00, 0x33, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x35, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x3C, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00, 0x31, 0x00, 0x10, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x33, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x3D, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00,\n0x2F, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x31, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x02, 0x00,\n0x10, 0x00, 0x01, 0x00, 0x2D, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x02, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00, 0x2B, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x02, 0x00,\n0x01, 0xFF, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00, 0x29, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x2B, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00, 0x27, 0x00, 0x10, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x29, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x42, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00,\n0x25, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x27, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x02, 0x00,\n0x10, 0x00, 0x01, 0x00, 0x23, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x25, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x02, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00, 0x21, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, 0x02, 0x00,\n0x01, 0xFF, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x00, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00, 0x1F, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x21, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x46, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00, 0x1D, 0x00, 0x10, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x47, 0x00, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00,\n0x1B, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x02, 0x00,\n0x10, 0x00, 0x01, 0x00, 0x19, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x02, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00, 0x17, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x19, 0x00, 0x02, 0x00,\n0x01, 0xFF, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00, 0x15, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x17, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x4B, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00, 0x13, 0x00, 0x10, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x15, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x4C, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00, \n0x11, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x02, 0x00,\n0x10, 0x00, 0x01, 0x00, 0x0F, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x11, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x02, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x4E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00, 0x0D, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x02, 0x00,\n0x01, 0xFF, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00, 0x0B, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x0D, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x50, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00, 0x09, 0x00, 0x10, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x51, 0x00, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00,\n0x07, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x02, 0x00,\n0x10, 0x00, 0x01, 0x00, 0x05, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x07, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x02, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00, 0x03, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x02, 0x00, \n0x01, 0xFF, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x00, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x10, 0x00, 0x01, 0x00, 0x01, 0x00, 0x10, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x03, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x02, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x55, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD,\n0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x5E, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x5D, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x5E, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x5C, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x03, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x5B, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x5C, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x5A, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x59, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x5A, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x58, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x59, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x57, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x58, 0x00, 0x03, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x56, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x57, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x55, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x56, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x09, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x54, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x55, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x53, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x54, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x52, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x53, 0x00, 0x03, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x51, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x52, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x0D, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x50, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x51, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x0E, 0x00, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x4F, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x50, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x4E, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x4F, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x4D, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x03, 0x00, \n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x4C, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x4D, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x12, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x4B, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x13, 0x00, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x4A, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x49, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x4A, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x48, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x49, 0x00, 0x03, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x47, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x48, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x00, 0x17, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x46, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x47, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x18, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x45, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x46, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x19, 0x00, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x44, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x45, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x43, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x44, 0x00, 0x03, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1B, 0x00, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x42, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x43, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x1C, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x41, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x42, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x1D, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x40, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x41, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x3F, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x40, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x3E, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x03, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x3D, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x3E, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x21, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x3C, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x22, 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x3B, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x23, 0x00, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x3A, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3B, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x39, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x03, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x38, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x39, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x00, 0x26, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x37, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x38, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x27, 0x00, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x36, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x37, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x28, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x35, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x36, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x00, 0x29, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x34, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x35, 0x00, 0x03, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2A, 0x00, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x33, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x34, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x2B, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x32, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x33, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x2C, 0x00, 0x2C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x31, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x32, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x2D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x30, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x31, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x2F, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x30, 0x00, 0x03, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2F, 0x00, 0x2F, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x2E, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x2F, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x30, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x2D, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x2E, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x31, 0x00, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x2C, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2D, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x32, 0x00, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x2B, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2C, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x00, 0x33, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x2A, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x03, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x00, 0x34, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x29, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x2A, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x00, 0x35, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x28, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x29, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x36, 0x00, 0x36, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x27, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x28, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x37, 0x00, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x26, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x27, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x25, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x26, 0x00, 0x03, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x39, 0x00, 0x39, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x24, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x25, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3A, 0x00, 0x3A, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x23, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x3B, 0x00, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x22, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x21, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x22, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x03, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3E, 0x00, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x1F, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x20, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3F, 0x00, 0x3F, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x1D, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x42, 0x00, 0x42, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x1B, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x03, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x1A, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x1B, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x00, 0x44, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x19, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x45, 0x00, 0x45, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x18, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x19, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x17, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x18, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x00, 0x47, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x16, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x17, 0x00, 0x03, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x15, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x16, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, 0x00, 0x49, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x14, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x15, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x4A, 0x00, 0x4A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x13, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x4B, 0x00, 0x4B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x12, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4C, 0x00, 0x4C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x11, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x03, 0x00, \n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x4D, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x10, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x11, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4E, 0x00, 0x4E, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0F, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x4F, 0x00, 0x4F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x0E, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x50, 0x00, 0x50, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x0D, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x51, 0x00, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x03, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x52, 0x00, 0x52, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0B, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x0C, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x00, 0x53, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0A, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x54, 0x00, 0x54, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x09, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x55, 0x00, 0x55, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x00, 0x56, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x07, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x03, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x06, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x07, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x00, 0x58, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x05, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x59, 0x00, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x04, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x5A, 0x00, 0x5A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x03, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5B, 0x00, 0x5B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5C, 0x00, 0x5C, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x03, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x00, 0x5D, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00, 0x28, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x29, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x5E, 0x00, 0x5E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x27, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x28, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x26, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x27, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00, 0x25, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x26, 0x00, 0x04, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x00, 0x61, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00, 0x24, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x25, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x00, 0x62, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00, 0x23, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x24, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x63, 0x00, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x22, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x23, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x64, 0x00, 0x64, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x21, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x22, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x00, 0x65, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00, 0x20, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x21, 0x00, 0x04, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x00, 0x66, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00, 0x1F, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x20, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x00, 0x67, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00, 0x1E, 0x00, 0x08, 0x00, \n0x02, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x68, 0x00, 0x68, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x1D, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1E, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x69, 0x00, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x1C, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1D, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6A, 0x00, 0x6A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00, 0x1B, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x1C, 0x00, 0x04, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6B, 0x00, 0x6B, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00, 0x1A, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x1B, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6C, 0x00, 0x6C, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00, 0x19, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x1A, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x6D, 0x00, 0x6D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x18, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x19, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x6E, 0x00, 0x6E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00, \n0x08, 0x00, 0x01, 0x00, 0x17, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x18, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00, 0x16, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x17, 0x00, 0x04, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00, 0x15, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x16, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x71, 0x00, 0x71, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00, 0x14, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x15, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x72, 0x00, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x13, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x14, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x12, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x13, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x00, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00, 0x11, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x12, 0x00, 0x04, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x75, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00, 0x10, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x11, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x76, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0F, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x10, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x77, 0x00, 0x77, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x0E, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0F, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x78, 0x00, 0x78, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x0D, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x79, 0x00, 0x79, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0C, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x04, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x7A, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0B, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x0C, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x7B, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00, 0x0A, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7C, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x09, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7D, 0x00, 0x7D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x08, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x09, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7E, 0x00, 0x7E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00, 0x07, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x08, 0x00, 0x04, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00, 0x06, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x07, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00, 0x05, 0x00, 0x08, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x06, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00,\n0x04, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x05, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x82, 0x00, 0x82, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00,\n0x08, 0x00, 0x01, 0x00, 0x03, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, \n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00, 0x02, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x04, 0x00,\n0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0x00, 0x84, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x81, 0x00, 0x08, 0x00, 0x01, 0x00, 0x01, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x04, 0x00, 0x01, 0xFF, 0x80, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x00, 0x85, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xD0, 0x00, 0x08, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x01,\n0x82, 0x00, 0x00, 0x00, 0x21, 0x00, 0x05, 0x00, 0x01, 0xFF, 0xD0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0x00, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xD1, 0x00, 0x08, 0x00, 0x20, 0x00,\n0x01, 0x00, 0x00, 0x01, 0x82, 0x00, 0x00, 0x00, 0x21, 0x00, 0x06, 0x00, 0x01, 0xFF, 0xD0, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0x00, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xD2, 0x00,\n0x08, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x01, 0x82, 0x00, 0x00, 0x00, 0x21, 0x00, 0x07, 0x00, 0x01, 0xFF, 0xD0, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0x00, 0xD1, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0xD3, 0x00, 0x08, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x01, 0x82, 0x00, 0x00, 0x00, 0x21, 0x00, 0x08, 0x00,\n0x01, 0xFF, 0xD0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xD1, 0x00, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xD4, 0x00, 0x08, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x01, 0x82, 0x00, 0x00, 0x00,\n0x21, 0x00, 0x09, 0x00, 0x01, 0xFF, 0xD0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xD1, 0x00, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xD5, 0x00, 0x08, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x01,\n0x82, 0x00, 0x00, 0x00, 0x21, 0x00, 0x0A, 0x00, 0x01, 0xFF, 0xD0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0x00, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x05, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xD6, 0x00, 0x08, 0x00, 0x20, 0x00,\n0x01, 0x00, 0x00, 0x01, 0x82, 0x00, 0x00, 0x00, 0x21, 0x00, 0x0B, 0x00, 0x01, 0xFF, 0xD0, 0x00, 0x08, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0x00, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xD8, 0x00,\n0x08, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x01, 0x82, 0x00, 0x00, 0x00, 0x21, 0x00, 0x0C, 0x00, 0x01, 0xFF, 0xD0, 0x00,\n0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0x00, 0xD1, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x01, 0xFF, 0xD9, 0x00, 0x08, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x01, 0x82, 0x00, 0x00, 0x00, 0x21, 0x00, 0x0D, 0x00,\n0x01, 0xFF, 0xD0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0xD1, 0x00, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xF1, 0x00, 0x08, 0x00, 0x02, 0x00, 0x01, 0x00, 0x10, 0x00, 0x82, 0x00, 0x00, 0x00,\n0x03, 0x00, 0x0E, 0x00, 0x01, 0xFF, 0xD0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0xD1, 0x00, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x09, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xF3, 0x00, 0x08, 0x00, 0x02, 0x00, 0x01, 0x00, 0x10, 0x00,\n0x82, 0x00, 0x00, 0x00, 0x03, 0x00, 0x0F, 0x00, 0x01, 0xFF, 0xD0, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD1, 0x00, 0xD1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x0A, 0x00, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x0F, 0x00,\n0x00, 0x00, 0x0F, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,\n0x80, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x80, 0x00, 0x01, 0xFF,\n0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00,\n0x04, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,\n0xD0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x01, 0xFF,\n0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00,\n0x09, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x00,\n0x02, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,\n0xD0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x01, 0xFF,\n0x00, 0x00, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0xD0, 0x00, 0x01, 0xFF, 0x00, 0x00, 0x00, 0x00,\n0x0E, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00,\n"
  }
]