diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 3647c3fd4..000000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,65 +0,0 @@ -version: 2.1 -jobs: - emulator-build-test: - docker: - - image: circleci/python:3.7 - steps: - - checkout - - run: - name: Update Submodules - command: | - git submodule update --init --recursive - - setup_remote_docker - - run: - name: Build Emulator and Run Tests - command: | - pushd ./scripts/emulator - set +e - docker-compose up --build firmware-unit - docker-compose up --build python-keepkey - set -e - mkdir -p ../../test-reports - docker cp "$(docker-compose ps -q firmware-unit)":/kkemu/test-reports/. ../../test-reports/ - docker cp "$(docker-compose ps -q python-keepkey)":/kkemu/test-reports/. ../../test-reports/ - popd - [ "$(cat test-reports/python-keepkey/status)$(cat test-reports/firmware-unit/status)" == "00" ] || exit 1 - - store_test_results: - path: test-reports - - emulator-publish: - docker: - - image: circleci/python:3.7 - steps: - - checkout - - run: - name: Update Submodules - command: | - git submodule update --init --recursive - - setup_remote_docker - - run: - name: Build Emulator - command: | - pushd ./scripts/emulator - docker-compose build kkemu - popd - - run: - name: Publish Emulator - command: | - docker login -u $KK_DOCKERHUB_USER -p $KK_DOCKERHUB_PASS - docker push kktech/kkemu - LATEST_IMAGE_ID=$(docker images | grep -i kktech/kkemu | grep -i latest | awk '{print $3}' ) - FW_VERSION=$(cat ./CMakeLists.txt | tr -d '\n' | awk -v FS="(KeepKeyFirmwareVERSION|LANGUAGES)" '{print $1}' | awk '{print $4}') - docker tag $LATEST_IMAGE_ID kktech/kkemu:v$FW_VERSION - docker push kktech/kkemu - -workflows: - version: 2 - emulator: - jobs: - - emulator-build-test - - emulator-publish: - filters: - branches: - only: master - requires: - - emulator-build-test diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..6e7ed7f9b --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,467 @@ +# KeepKey Firmware CI Pipeline +# +# FAIL FAST — quick checks gate everything, no wasted compute. +# +# Stage 1: GATE (seconds, no Docker) +# ├─ lint-format clang-format diff check +# ├─ secret-scan gitleaks credential detection +# └─ check-submodules verify all deps present +# +# Stage 2: BUILD (parallel, gated by Stage 1) +# ├─ build-emulator Docker image → artifact +# └─ build-arm-firmware cross-compile → .bin/.elf (downloadable) +# +# Stage 3: TEST (parallel, gated by Stage 2) +# ├─ unit-tests GoogleTest (make xunit) +# └─ python-integration full test suite +# +# Stage 4: PUBLISH (manual trigger, all tests must pass) +# └─ publish-emulator DockerHub push (workflow_dispatch only) + +name: CI + +on: + push: + branches: [master, develop, 'feature/**', 'fix/**'] + pull_request: + branches: [master, develop] + workflow_dispatch: + inputs: + publish_emulator: + description: 'Publish emulator image to DockerHub' + required: false + type: boolean + default: false + +env: + BASE_IMAGE: kktech/firmware:v15 + EMU_IMAGE: kkemu-ci + +jobs: + # ═══════════════════════════════════════════════════════════ + # STAGE 1: GATE — kill bad PRs in seconds + # ═══════════════════════════════════════════════════════════ + + lint-format: + runs-on: ubuntu-latest + timeout-minutes: 3 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Install clang-format + run: sudo apt-get install -y clang-format-14 + + - name: Check code formatting + run: | + FAILED=0 + for f in $(find include/keepkey lib/firmware lib/board lib/transport/src \ + -name '*.c' -o -name '*.h' 2>/dev/null | grep -v generated | grep -v '.pb.'); do + if ! clang-format-14 --style=file --dry-run --Werror "$f" 2>/dev/null; then + echo "::warning file=$f::Formatting differs from .clang-format" + FAILED=1 + fi + done + if [ "$FAILED" = "1" ]; then + echo "" + echo "Run: clang-format -i to fix formatting" + echo "Note: treating as warning until codebase is reformatted" + fi + # Warn-only until existing code is reformatted + continue-on-error: true + + secret-scan: + runs-on: ubuntu-latest + timeout-minutes: 2 + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Run gitleaks + uses: gitleaks/gitleaks-action@v2 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + check-submodules: + runs-on: ubuntu-latest + timeout-minutes: 2 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Verify submodules are declared + run: | + echo "Checking required submodule declarations..." + REQUIRED=( + "deps/crypto/trezor-firmware" + "deps/device-protocol" + "deps/python-keepkey" + "deps/googletest" + "deps/qrenc/QR-Code-generator" + "deps/sca-hardening/SecAESSTM32" + ) + FAILED=0 + for sub in "${REQUIRED[@]}"; do + if ! grep -q "$sub" .gitmodules; then + echo "::error::Missing required submodule: $sub" + FAILED=1 + else + echo " ✓ $sub" + fi + done + [ "$FAILED" = "0" ] || exit 1 + + # ═══════════════════════════════════════════════════════════ + # STAGE 2: BUILD — compile only after gate passes + # ═══════════════════════════════════════════════════════════ + + build-emulator: + needs: [check-submodules, secret-scan] + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Init submodules + run: | + git submodule update --init deps/crypto/trezor-firmware + git submodule update --init deps/device-protocol + git submodule update --init deps/python-keepkey + git submodule update --init deps/googletest + git submodule update --init deps/qrenc/QR-Code-generator + git submodule update --init deps/sca-hardening/SecAESSTM32 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Cache base image + id: cache-base + uses: actions/cache@v4 + with: + path: /tmp/base-image.tar + key: base-image-${{ env.BASE_IMAGE }} + + - name: Pull and cache base image + if: steps.cache-base.outputs.cache-hit != 'true' + run: | + docker pull ${{ env.BASE_IMAGE }} + docker save ${{ env.BASE_IMAGE }} -o /tmp/base-image.tar + + - name: Load base image from cache + if: steps.cache-base.outputs.cache-hit == 'true' + run: docker load -i /tmp/base-image.tar + + - name: Build emulator image + run: | + docker build \ + -t ${{ env.EMU_IMAGE }} \ + -f scripts/emulator/Dockerfile \ + . + + - name: Save emulator image + run: docker save ${{ env.EMU_IMAGE }} -o /tmp/emu-image.tar + + - name: Upload emulator image artifact + uses: actions/upload-artifact@v4 + with: + name: emu-image + path: /tmp/emu-image.tar + retention-days: 1 + + build-arm-firmware: + needs: [check-submodules, secret-scan] + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Init submodules + run: | + git submodule update --init deps/crypto/trezor-firmware + git submodule update --init deps/device-protocol + git submodule update --init deps/python-keepkey + git submodule update --init deps/googletest + git submodule update --init deps/qrenc/QR-Code-generator + git submodule update --init deps/sca-hardening/SecAESSTM32 + + - name: Cache base image + id: cache-base + uses: actions/cache@v4 + with: + path: /tmp/base-image.tar + key: base-image-${{ env.BASE_IMAGE }} + + - name: Pull and cache base image + if: steps.cache-base.outputs.cache-hit != 'true' + run: | + docker pull ${{ env.BASE_IMAGE }} + docker save ${{ env.BASE_IMAGE }} -o /tmp/base-image.tar + + - name: Load base image from cache + if: steps.cache-base.outputs.cache-hit == 'true' + run: docker load -i /tmp/base-image.tar + + - name: Extract firmware version + id: version + run: | + FW_VERSION=$(sed -n '/^project/,/)/p' CMakeLists.txt | grep -oP '\d+\.\d+\.\d+') + GIT_SHORT=$(git rev-parse --short HEAD) + echo "fw_version=${FW_VERSION}" >> "$GITHUB_OUTPUT" + echo "git_short=${GIT_SHORT}" >> "$GITHUB_OUTPUT" + echo "Firmware version: ${FW_VERSION} (${GIT_SHORT})" + + - name: Cross-compile firmware for ARM + run: | + docker run --rm \ + -v ${{ github.workspace }}:/root/keepkey-firmware:z \ + ${{ env.BASE_IMAGE }} /bin/sh -c "\ + mkdir /root/build && cd /root/build && \ + cmake -C /root/keepkey-firmware/cmake/caches/device.cmake /root/keepkey-firmware \ + -DCMAKE_BUILD_TYPE=MinSizeRel \ + -DCMAKE_COLOR_MAKEFILE=ON && \ + make && \ + mkdir -p /root/keepkey-firmware/bin && \ + cp bin/*.bin /root/keepkey-firmware/bin/ && \ + cp bin/*.elf /root/keepkey-firmware/bin/ && \ + chmod -R a+rw /root/keepkey-firmware/bin" + + - name: Rename firmware artifacts + run: | + cd bin + for f in *.bin; do + [ -f "$f" ] || continue + mv "$f" "firmware.keepkey.v${{ steps.version.outputs.fw_version }}-${{ steps.version.outputs.git_short }}-${f}" + done + for f in *.elf; do + [ -f "$f" ] || continue + mv "$f" "firmware.keepkey.v${{ steps.version.outputs.fw_version }}-${{ steps.version.outputs.git_short }}-${f}" + done + ls -lh + echo "::notice::Firmware v${{ steps.version.outputs.fw_version }} built successfully" + + - name: Upload firmware artifacts + uses: actions/upload-artifact@v4 + with: + name: firmware-v${{ steps.version.outputs.fw_version }}-${{ steps.version.outputs.git_short }} + path: | + bin/*.bin + bin/*.elf + retention-days: 90 + + build-arm-firmware-btconly: + needs: [check-submodules, secret-scan] + runs-on: ubuntu-latest + timeout-minutes: 15 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Init submodules + run: | + git submodule update --init deps/crypto/trezor-firmware + git submodule update --init deps/device-protocol + git submodule update --init deps/python-keepkey + git submodule update --init deps/googletest + git submodule update --init deps/qrenc/QR-Code-generator + git submodule update --init deps/sca-hardening/SecAESSTM32 + + - name: Cache base image + id: cache-base + uses: actions/cache@v4 + with: + path: /tmp/base-image.tar + key: base-image-${{ env.BASE_IMAGE }} + + - name: Pull and cache base image + if: steps.cache-base.outputs.cache-hit != 'true' + run: | + docker pull ${{ env.BASE_IMAGE }} + docker save ${{ env.BASE_IMAGE }} -o /tmp/base-image.tar + + - name: Load base image from cache + if: steps.cache-base.outputs.cache-hit == 'true' + run: docker load -i /tmp/base-image.tar + + - name: Extract firmware version + id: version + run: | + FW_VERSION=$(sed -n '/^project/,/)/p' CMakeLists.txt | grep -oP '\d+\.\d+\.\d+') + GIT_SHORT=$(git rev-parse --short HEAD) + echo "fw_version=${FW_VERSION}" >> "$GITHUB_OUTPUT" + echo "git_short=${GIT_SHORT}" >> "$GITHUB_OUTPUT" + echo "Firmware version: ${FW_VERSION}-btconly (${GIT_SHORT})" + + - name: Cross-compile BTC-only firmware + run: | + docker run --rm \ + -v ${{ github.workspace }}:/root/keepkey-firmware:z \ + ${{ env.BASE_IMAGE }} /bin/sh -c "\ + mkdir /root/build && cd /root/build && \ + cmake -C /root/keepkey-firmware/cmake/caches/device.cmake /root/keepkey-firmware \ + -DCMAKE_BUILD_TYPE=MinSizeRel \ + -DKK_BITCOIN_ONLY=ON && \ + make && \ + mkdir -p /root/keepkey-firmware/bin-btconly && \ + cp bin/firmware.keepkey.bin /root/keepkey-firmware/bin-btconly/ && \ + cp bin/firmware.keepkey.elf /root/keepkey-firmware/bin-btconly/ && \ + chmod -R a+rw /root/keepkey-firmware/bin-btconly" + + - name: Upload BTC-only firmware artifacts + uses: actions/upload-artifact@v4 + with: + name: firmware-btconly-v${{ steps.version.outputs.fw_version }}-${{ steps.version.outputs.git_short }} + path: bin-btconly/* + retention-days: 90 + + # ═══════════════════════════════════════════════════════════ + # STAGE 3: TEST — run only after builds succeed + # ═══════════════════════════════════════════════════════════ + + unit-tests: + needs: build-emulator + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Download emulator image + uses: actions/download-artifact@v4 + with: + name: emu-image + path: /tmp + + - name: Load emulator image + run: docker load -i /tmp/emu-image.tar + + - name: Run unit tests + run: | + # make xunit returns non-zero if any test fails — capture + # exit code so JUnit XML still gets copied for reporting + docker run --rm \ + -v ${{ github.workspace }}/test-reports:/kkemu/test-reports \ + --entrypoint /bin/sh \ + ${{ env.EMU_IMAGE }} \ + -c "mkdir -p /kkemu/test-reports/firmware-unit && \ + make xunit; RC=\$?; \ + cp -r unittests/*.xml /kkemu/test-reports/firmware-unit/ 2>/dev/null; \ + exit \$RC" + + - name: Upload unit test results + uses: mikepenz/action-junit-report@v4 + if: always() + with: + report_paths: test-reports/firmware-unit/*.xml + check_name: Unit Tests + + python-integration-tests: + needs: build-emulator + runs-on: ubuntu-latest + timeout-minutes: 20 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Init submodules + run: | + git submodule update --init deps/crypto/trezor-firmware + git submodule update --init deps/device-protocol + git submodule update --init deps/python-keepkey + git submodule update --init deps/googletest + git submodule update --init deps/qrenc/QR-Code-generator + git submodule update --init deps/sca-hardening/SecAESSTM32 + + - name: Download emulator image + uses: actions/download-artifact@v4 + with: + name: emu-image + path: /tmp + + - name: Load emulator image + run: docker load -i /tmp/emu-image.tar + + - name: Tag image for docker compose + run: docker tag ${{ env.EMU_IMAGE }} kktech/kkemu:latest + + - name: Run full test suite + working-directory: scripts/emulator + run: | + docker compose up --build --abort-on-container-exit python-keepkey + + - name: Collect test results + if: always() + working-directory: scripts/emulator + run: | + mkdir -p ${{ github.workspace }}/test-reports/python-keepkey + # docker compose v2 ps only shows running containers; + # use -a to include stopped/exited containers + CID=$(docker compose ps -a -q python-keepkey 2>/dev/null || true) + if [ -n "$CID" ]; then + docker cp "$CID":/kkemu/test-reports/python-keepkey/junit.xml \ + ${{ github.workspace }}/test-reports/python-keepkey/junit.xml || true + docker cp "$CID":/kkemu/test-reports/python-keepkey/status \ + ${{ github.workspace }}/test-reports/python-keepkey/status || true + fi + STATUS=$(cat ${{ github.workspace }}/test-reports/python-keepkey/status 2>/dev/null || echo "1") + echo "Python tests exit status: $STATUS" + [ "$STATUS" = "0" ] || exit 1 + + - name: Upload Python test results + uses: mikepenz/action-junit-report@v4 + if: always() + with: + report_paths: test-reports/python-keepkey/junit.xml + check_name: Python Integration Tests + + - name: Tear down + if: always() + working-directory: scripts/emulator + run: docker compose down -v || true + + # ═══════════════════════════════════════════════════════════ + # STAGE 4: PUBLISH — manual trigger only, all tests must pass + # ═══════════════════════════════════════════════════════════ + + publish-emulator: + needs: [unit-tests, python-integration-tests, build-arm-firmware, build-arm-firmware-btconly] + if: >- + github.event_name == 'workflow_dispatch' && + github.event.inputs.publish_emulator == 'true' + runs-on: ubuntu-latest + timeout-minutes: 10 + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Download emulator image + uses: actions/download-artifact@v4 + with: + name: emu-image + path: /tmp + + - name: Load emulator image + run: docker load -i /tmp/emu-image.tar + + - name: Extract firmware version + id: version + run: | + FW_VERSION=$(sed -n '/^project/,/)/p' CMakeLists.txt | grep -oP '\d+\.\d+\.\d+') + echo "fw_version=${FW_VERSION}" >> "$GITHUB_OUTPUT" + echo "Firmware version: ${FW_VERSION}" + + - name: Tag images for publish + run: | + docker tag ${{ env.EMU_IMAGE }} kktech/kkemu:latest + docker tag ${{ env.EMU_IMAGE }} kktech/kkemu:v${{ steps.version.outputs.fw_version }} + + - name: Login to DockerHub + uses: docker/login-action@v3 + with: + username: ${{ secrets.KK_DOCKERHUB_USER }} + password: ${{ secrets.KK_DOCKERHUB_PASS }} + + - name: Push emulator images + run: | + docker push kktech/kkemu:latest + docker push kktech/kkemu:v${{ steps.version.outputs.fw_version }} diff --git a/CMakeLists.txt b/CMakeLists.txt index 3d68c588a..554ebbdd9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,6 +12,7 @@ set(BOOTLOADER_PATCH_VERSION 5) option(KK_EMULATOR "Build the emulator" OFF) option(KK_DEBUG_LINK "Build with debug-link enabled" OFF) option(KK_BUILD_FUZZERS "Build the fuzzers?" OFF) +option(KK_BITCOIN_ONLY "Build Bitcoin-only firmware" OFF) set(LIBOPENCM3_PATH /root/libopencm3 CACHE PATH "Path to an already-built libopencm3") @@ -78,13 +79,25 @@ add_definitions(-DED25519_FORCE_32BIT=1) add_definitions(-DUSE_PRECOMPUTED_CP=0) -add_definitions(-DUSE_ETHEREUM=1) -add_definitions(-DUSE_KECCAK=1) -add_definitions(-DUSE_GRAPHENE=0) -add_definitions(-DUSE_CARDANO=0) -add_definitions(-DUSE_MONERO=0) -add_definitions(-DUSE_NEM=0) -add_definitions(-DUSE_NANO=1) +if(KK_BITCOIN_ONLY) + add_definitions(-DBITCOIN_ONLY=1) + add_definitions(-DUSE_ETHEREUM=0) + add_definitions(-DUSE_KECCAK=1) + add_definitions(-DUSE_GRAPHENE=0) + add_definitions(-DUSE_CARDANO=0) + add_definitions(-DUSE_MONERO=0) + add_definitions(-DUSE_NEM=0) + add_definitions(-DUSE_NANO=0) +else() + add_definitions(-DBITCOIN_ONLY=0) + add_definitions(-DUSE_ETHEREUM=1) + add_definitions(-DUSE_KECCAK=1) + add_definitions(-DUSE_GRAPHENE=0) + add_definitions(-DUSE_CARDANO=0) + add_definitions(-DUSE_MONERO=0) + add_definitions(-DUSE_NEM=0) + add_definitions(-DUSE_NANO=1) +endif() add_definitions(-DRAND_PLATFORM_INDEPENDENT=0) diff --git a/deps/crypto/CMakeLists.txt b/deps/crypto/CMakeLists.txt index cd735668c..1e0055079 100644 --- a/deps/crypto/CMakeLists.txt +++ b/deps/crypto/CMakeLists.txt @@ -1,4 +1,5 @@ -set(sources +# BTC core crypto — always compiled +set(base_sources trezor-firmware/crypto/bip39.c trezor-firmware/crypto/bip39_english.c trezor-firmware/crypto/hmac.c @@ -6,65 +7,48 @@ set(sources trezor-firmware/crypto/sha2.c trezor-firmware/crypto/base32.c trezor-firmware/crypto/hasher.c - #trezor-firmware/crypto/tools/bip39bruteforce.c - #trezor-firmware/crypto/tools/mktable.c - #trezor-firmware/crypto/tools/xpubaddrgen.c trezor-firmware/crypto/rand.c trezor-firmware/crypto/rc4.c trezor-firmware/crypto/blake256.c trezor-firmware/crypto/cash_addr.c trezor-firmware/crypto/curves.c trezor-firmware/crypto/rfc6979.c - trezor-firmware/crypto/ed25519-donna/curve25519-donna-scalarmult-base.c - trezor-firmware/crypto/ed25519-donna/ed25519-donna-32bit-tables.c - trezor-firmware/crypto/ed25519-donna/ed25519.c - trezor-firmware/crypto/ed25519-donna/curve25519-donna-helpers.c - trezor-firmware/crypto/ed25519-donna/ed25519-blake2b.c - trezor-firmware/crypto/ed25519-donna/ed25519-keccak.c - trezor-firmware/crypto/ed25519-donna/ed25519-sha3.c - trezor-firmware/crypto/ed25519-donna/ed25519-donna-basepoint-table.c - trezor-firmware/crypto/ed25519-donna/modm-donna-32bit.c - trezor-firmware/crypto/ed25519-donna/curve25519-donna-32bit.c - trezor-firmware/crypto/ed25519-donna/ed25519-donna-impl-base.c - trezor-firmware/crypto/nem.c - trezor-firmware/crypto/nano.c - #trezor-firmware/crypto/tests/test_check.c - #trezor-firmware/crypto/tests/test_openssl.c - #trezor-firmware/crypto/tests/test_speed.c trezor-firmware/crypto/secp256k1.c trezor-firmware/crypto/bignum.c trezor-firmware/crypto/segwit_addr.c trezor-firmware/crypto/ripemd160.c - trezor-firmware/crypto/groestl.c - trezor-firmware/crypto/nist256p1.c - #trezor-firmware/crypto/monero/serialize.c - #trezor-firmware/crypto/monero/range_proof.c - #trezor-firmware/crypto/monero/xmr.c - #trezor-firmware/crypto/monero/base58.c trezor-firmware/crypto/memzero.c trezor-firmware/crypto/blake2b.c trezor-firmware/crypto/script.c trezor-firmware/crypto/bip32.c trezor-firmware/crypto/address.c trezor-firmware/crypto/blake2s.c - trezor-firmware/crypto/sha3.c trezor-firmware/crypto/base58.c trezor-firmware/crypto/ecdsa.c trezor-firmware/crypto/pbkdf2.c trezor-firmware/crypto/aes/aeskey.c trezor-firmware/crypto/aes/aescrypt.c trezor-firmware/crypto/aes/aes_modes.c - #trezor-firmware/crypto/aes/aestst.c - trezor-firmware/crypto/aes/aestab.c) - - # Clang 5.0 in the docker image (kktech/firmware:v7) is missing - # , which breaks these. Until they're needed, we'll just elide - # them. - #trezor-firmware/crypto/chacha20poly1305/chacha_merged.c - #trezor-firmware/crypto/chacha20poly1305/rfc7539.c - #trezor-firmware/crypto/chacha20poly1305/poly1305-donna.c - #trezor-firmware/crypto/chacha20poly1305/chacha20poly1305.c + trezor-firmware/crypto/aes/aestab.c + trezor-firmware/crypto/groestl.c + trezor-firmware/crypto/sha3.c + trezor-firmware/crypto/nist256p1.c + trezor-firmware/crypto/ed25519-donna/curve25519-donna-scalarmult-base.c + trezor-firmware/crypto/ed25519-donna/ed25519-donna-32bit-tables.c + trezor-firmware/crypto/ed25519-donna/ed25519.c + trezor-firmware/crypto/ed25519-donna/curve25519-donna-helpers.c + trezor-firmware/crypto/ed25519-donna/ed25519-blake2b.c + trezor-firmware/crypto/ed25519-donna/ed25519-keccak.c + trezor-firmware/crypto/ed25519-donna/ed25519-sha3.c + trezor-firmware/crypto/ed25519-donna/ed25519-donna-basepoint-table.c + trezor-firmware/crypto/ed25519-donna/modm-donna-32bit.c + trezor-firmware/crypto/ed25519-donna/curve25519-donna-32bit.c + trezor-firmware/crypto/ed25519-donna/ed25519-donna-impl-base.c) +# Altcoin crypto — skipped in BTC-only builds +set(altcoin_sources + trezor-firmware/crypto/nem.c + trezor-firmware/crypto/nano.c) include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/trezor-firmware/crypto @@ -72,5 +56,10 @@ include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/trezor-firmware/crypto/ed25519-donna ${OPENSSL_INCLUDE_DIR}) +if(KK_BITCOIN_ONLY) + set(sources ${base_sources}) +else() + set(sources ${base_sources} ${altcoin_sources}) +endif() add_library(trezorcrypto ${sources}) diff --git a/deps/device-protocol b/deps/device-protocol index 323802f17..17b38803e 160000 --- a/deps/device-protocol +++ b/deps/device-protocol @@ -1 +1 @@ -Subproject commit 323802f17dd44165a5100357df771348c8b49672 +Subproject commit 17b38803ee186b4411cc0219a20a1bc99aee9ea4 diff --git a/deps/python-keepkey b/deps/python-keepkey index f1dd2b684..7f0d55fe8 160000 --- a/deps/python-keepkey +++ b/deps/python-keepkey @@ -1 +1 @@ -Subproject commit f1dd2b6847346abe8ea2985b22d688de4911643f +Subproject commit 7f0d55fe8d360d05ecfe10f793139dae6f113ebf diff --git a/fuzzer/firmware/CMakeLists.txt b/fuzzer/firmware/CMakeLists.txt index e38b4f8f5..e61f1fa01 100644 --- a/fuzzer/firmware/CMakeLists.txt +++ b/fuzzer/firmware/CMakeLists.txt @@ -10,7 +10,6 @@ set(libraries kkboard kkboard.keepkey kkvariant.keepkey - kkvariant.salt kkboard kkemulator trezorcrypto diff --git a/include/keepkey/firmware/ton.h b/include/keepkey/firmware/ton.h new file mode 100644 index 000000000..78e929c9b --- /dev/null +++ b/include/keepkey/firmware/ton.h @@ -0,0 +1,68 @@ +/* + * This file is part of the KeepKey project. + * + * Copyright (C) 2024 KeepKey + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library. If not, see . + */ + +#ifndef KEEPKEY_FIRMWARE_TON_H +#define KEEPKEY_FIRMWARE_TON_H + +#include "trezor/crypto/bip32.h" +#include "trezor/crypto/ed25519-donna/ed25519.h" + +#include "messages-ton.pb.h" + +// TON address length (Base64 URL-safe encoded, typically 48 chars) +#define TON_ADDRESS_MAX_LEN 64 +#define TON_RAW_ADDRESS_MAX_LEN 128 + +// TON decimals (1 TON = 1,000,000,000 nanoTON) +#define TON_DECIMALS 9 + +/** + * Generate TON address from Ed25519 public key + * @param public_key Ed25519 public key (32 bytes) + * @param bounceable Bounceable flag for address encoding + * @param testnet Testnet flag for address encoding + * @param workchain Workchain ID (-1 or 0) + * @param address Output buffer for user-friendly Base64 encoded address + * @param address_len Length of address output buffer + * @param raw_address Output buffer for raw address format (workchain:hash) + * @param raw_address_len Length of raw_address output buffer + * @return true on success, false on failure + */ +bool ton_get_address(const ed25519_public_key public_key, bool bounceable, + bool testnet, int32_t workchain, char *address, + size_t address_len, char *raw_address, + size_t raw_address_len); + +/** + * Format TON amount (nanoTON) for display + * @param buf Output buffer + * @param len Length of output buffer + * @param amount Amount in nanoTON (1 TON = 1,000,000,000 nanoTON) + */ +void ton_formatAmount(char *buf, size_t len, uint64_t amount); + +/** + * Sign a TON transaction + * @param node HD node containing private key + * @param msg TonSignTx request message + * @param resp TonSignedTx response message (will be filled with signature) + */ +void ton_signTx(const HDNode *node, const TonSignTx *msg, TonSignedTx *resp); + +#endif diff --git a/include/keepkey/firmware/tron.h b/include/keepkey/firmware/tron.h new file mode 100644 index 000000000..df24496dc --- /dev/null +++ b/include/keepkey/firmware/tron.h @@ -0,0 +1,60 @@ +/* + * This file is part of the KeepKey project. + * + * Copyright (C) 2024 KeepKey + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library. If not, see . + */ + +#ifndef KEEPKEY_FIRMWARE_TRON_H +#define KEEPKEY_FIRMWARE_TRON_H + +#include "trezor/crypto/bip32.h" + +#include "messages-tron.pb.h" + +// TRON address length (Base58Check, typically 34 chars starting with 'T') +#define TRON_ADDRESS_MAX_LEN 64 + +// TRON decimals (1 TRX = 1,000,000 SUN) +#define TRON_DECIMALS 6 + +/** + * Generate TRON address from secp256k1 public key + * @param public_key secp256k1 public key (33 bytes compressed) + * @param address Output buffer for Base58Check encoded address + * @param address_len Length of output buffer + * @return true on success, false on failure + */ +bool tron_getAddress(const uint8_t public_key[33], char *address, + size_t address_len); + +/** + * Format TRON amount (SUN) for display + * @param buf Output buffer + * @param len Length of output buffer + * @param amount Amount in SUN (1 TRX = 1,000,000 SUN) + */ +void tron_formatAmount(char *buf, size_t len, uint64_t amount); + +/** + * Sign a TRON transaction + * @param node HD node containing private key + * @param msg TronSignTx request message + * @param resp TronSignedTx response message (will be filled with signature) + */ +void tron_signTx(const HDNode *node, const TronSignTx *msg, + TronSignedTx *resp); + +#endif diff --git a/include/keepkey/transport/messages-ton.options b/include/keepkey/transport/messages-ton.options new file mode 100644 index 000000000..3f903a012 --- /dev/null +++ b/include/keepkey/transport/messages-ton.options @@ -0,0 +1,9 @@ +TonGetAddress.address_n max_count:8 +TonGetAddress.coin_name max_size:21 +TonSignTx.address_n max_count:8 +TonSignTx.coin_name max_size:21 +TonSignTx.raw_tx max_size:1024 +TonSignTx.to_address max_size:50 +TonAddress.address max_size:50 +TonAddress.raw_address max_size:70 +TonSignedTx.signature max_size:64 diff --git a/include/keepkey/transport/messages-tron.options b/include/keepkey/transport/messages-tron.options new file mode 100644 index 000000000..61faaf222 --- /dev/null +++ b/include/keepkey/transport/messages-tron.options @@ -0,0 +1,11 @@ +TronGetAddress.address_n max_count:8 +TronGetAddress.coin_name max_size:21 +TronSignTx.address_n max_count:8 +TronSignTx.coin_name max_size:21 +TronSignTx.raw_data max_size:1024 +TronSignTx.ref_block_bytes max_size:2 +TronSignTx.ref_block_hash max_size:8 +TronSignTx.contract_type max_size:50 +TronSignTx.to_address max_size:35 +TronAddress.address max_size:35 +TronSignedTx.signature max_size:65 diff --git a/include/keepkey/variant/salt.h b/include/keepkey/variant/salt.h deleted file mode 100644 index ad632b650..000000000 --- a/include/keepkey/variant/salt.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef KEEPKEY_VARIANT_SALT_H -#define KEEPKEY_VARIANT_SALT_H - -#include "keepkey/board/variant.h" - -#define VARIANTINFO_SALT \ - .version = 1, .name = "SALT", .logo = &salt_logo, \ - .logo_reversed = &salt_logo_reversed, \ - .screensaver_timeout = ONE_SEC * 60 * 10, .screensaver = &salt_screensaver, - -extern const VariantInfo variant_salt; -extern const VariantAnimation salt_logo; -extern const VariantAnimation salt_logo_reversed; -extern const VariantAnimation salt_screensaver; - -#endif diff --git a/lib/board/variant.c b/lib/board/variant.c index d996858ab..479059b07 100644 --- a/lib/board/variant.c +++ b/lib/board/variant.c @@ -6,7 +6,6 @@ #include "trezor/crypto/ecdsa.h" #include "trezor/crypto/sha2.h" #include "keepkey/variant/keepkey.h" -#include "keepkey/variant/salt.h" #include @@ -118,7 +117,7 @@ const VariantInfo *__attribute__((weak)) variant_getInfo(void) { case MODEL_KEEPKEY: return &variant_keepkey; case MODEL_SALT: - return &variant_salt; + return &variant_keepkey; case MODEL_FOX: return &variant_keepkey; case MODEL_KASPERSKY: diff --git a/lib/firmware/CMakeLists.txt b/lib/firmware/CMakeLists.txt index e08ccfc69..bf187da5e 100644 --- a/lib/firmware/CMakeLists.txt +++ b/lib/firmware/CMakeLists.txt @@ -1,10 +1,24 @@ -set(sources +set(base_sources app_confirm.c app_layout.c - authenticator.c - binance.c coins.c crypto.c + fsm.c + home_sm.c + passphrase_sm.c + pin_sm.c + policy.c + recovery_cipher.c + reset.c + signing.c + storage.c + transaction.c + txin_check.c + u2f.c) + +set(altcoin_sources + authenticator.c + binance.c eip712.c eos.c eos-contracts/eosio.system.c @@ -19,27 +33,17 @@ set(sources ethereum_contracts/zxtransERC20.c ethereum_contracts/zxswap.c ethereum_tokens.c - fsm.c - home_sm.c mayachain.c nano.c osmosis.c - passphrase_sm.c - pin_sm.c - policy.c - recovery_cipher.c - reset.c ripple.c ripple_base58.c - signing.c signtx_tendermint.c - storage.c tendermint.c thorchain.c tiny-json.c - transaction.c - txin_check.c - u2f.c) + tron.c + ton.c) configure_file("${CMAKE_CURRENT_SOURCE_DIR}/scm_revision.h.in" "${CMAKE_CURRENT_BINARY_DIR}/scm_revision.h" @ONLY) @@ -50,15 +54,26 @@ include_directories( ${CMAKE_SOURCE_DIR}/lib/firmware ${CMAKE_CURRENT_BINARY_DIR}) +if(KK_BITCOIN_ONLY) + set(sources ${base_sources}) +else() + set(sources ${base_sources} ${altcoin_sources}) +endif() + add_library(kkfirmware ${sources}) -add_dependencies(kkfirmware kktransport.pb trezorcrypto qrcodegenerator ethereum_tokens.def) -set(ETHEREUM_TOKENS ${CMAKE_BINARY_DIR}/include/keepkey/firmware/ethereum_tokens) -set(UNISWAP_TOKENS ${CMAKE_BINARY_DIR}/include/keepkey/firmware/uniswap_tokens) +if(KK_BITCOIN_ONLY) + add_dependencies(kkfirmware kktransport.pb trezorcrypto qrcodegenerator) +else() + add_dependencies(kkfirmware kktransport.pb trezorcrypto qrcodegenerator ethereum_tokens.def) + + set(ETHEREUM_TOKENS ${CMAKE_BINARY_DIR}/include/keepkey/firmware/ethereum_tokens) + set(UNISWAP_TOKENS ${CMAKE_BINARY_DIR}/include/keepkey/firmware/uniswap_tokens) -add_custom_target(ethereum_tokens.def - COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/include/keepkey/firmware - COMMAND python3 ${CMAKE_SOURCE_DIR}/deps/python-keepkey/keepkeylib/eth/ethereum_tokens.py ${ETHEREUM_TOKENS}.def - COMMAND python3 ${CMAKE_SOURCE_DIR}/deps/python-keepkey/keepkeylib/eth/uniswap_tokens.py ${UNISWAP_TOKENS}.def) + add_custom_target(ethereum_tokens.def + COMMAND ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/include/keepkey/firmware + COMMAND python3 ${CMAKE_SOURCE_DIR}/deps/python-keepkey/keepkeylib/eth/ethereum_tokens.py ${ETHEREUM_TOKENS}.def + COMMAND python3 ${CMAKE_SOURCE_DIR}/deps/python-keepkey/keepkeylib/eth/uniswap_tokens.py ${UNISWAP_TOKENS}.def) +endif() add_library(kkfirmware.keepkey variant/keepkey/resources.c) diff --git a/lib/firmware/fsm.c b/lib/firmware/fsm.c index 0d779f448..e2a4cba72 100644 --- a/lib/firmware/fsm.c +++ b/lib/firmware/fsm.c @@ -34,30 +34,46 @@ #include "keepkey/board/variant.h" #include "keepkey/firmware/app_confirm.h" #include "keepkey/firmware/app_layout.h" +#if !BITCOIN_ONLY #include "keepkey/firmware/authenticator.h" +#endif #include "keepkey/firmware/coins.h" +#if !BITCOIN_ONLY #include "keepkey/firmware/cosmos.h" #include "keepkey/firmware/binance.h" +#endif #include "keepkey/firmware/crypto.h" +#if !BITCOIN_ONLY #include "keepkey/firmware/eos.h" #include "keepkey/firmware/eos-contracts.h" #include "keepkey/firmware/ethereum.h" #include "keepkey/firmware/ethereum_tokens.h" +#endif #include "keepkey/firmware/fsm.h" #include "keepkey/firmware/home_sm.h" +#if !BITCOIN_ONLY #include "keepkey/firmware/mayachain.h" #include "keepkey/firmware/osmosis.h" +#endif #include "keepkey/firmware/passphrase_sm.h" #include "keepkey/firmware/pin_sm.h" #include "keepkey/firmware/policy.h" #include "keepkey/firmware/recovery_cipher.h" #include "keepkey/firmware/reset.h" +#if !BITCOIN_ONLY #include "keepkey/firmware/ripple.h" +#endif #include "keepkey/firmware/signing.h" +#if !BITCOIN_ONLY #include "keepkey/firmware/signtx_tendermint.h" +#endif #include "keepkey/firmware/storage.h" +#if !BITCOIN_ONLY #include "keepkey/firmware/tendermint.h" #include "keepkey/firmware/thorchain.h" +#include "keepkey/firmware/tron.h" +#include "keepkey/firmware/ton.h" +#endif #include "keepkey/firmware/transaction.h" #include "keepkey/firmware/txin_check.h" #include "keepkey/firmware/u2f.h" @@ -75,6 +91,7 @@ #include "trezor/crypto/secp256k1.h" #include "messages.pb.h" +#if !BITCOIN_ONLY #include "messages-ethereum.pb.h" #include "messages-binance.pb.h" #include "messages-cosmos.pb.h" @@ -84,6 +101,9 @@ #include "messages-ripple.pb.h" #include "messages-thorchain.pb.h" #include "messages-mayachain.pb.h" +#include "messages-tron.pb.h" +#include "messages-ton.pb.h" +#endif #include @@ -272,10 +292,13 @@ void fsm_msgClearSession(ClearSession *msg) { #include "fsm_msg_common.h" #include "fsm_msg_coin.h" +#if !BITCOIN_ONLY #include "fsm_msg_ethereum.h" #include "fsm_msg_nano.h" +#endif #include "fsm_msg_crypto.h" #include "fsm_msg_debug.h" +#if !BITCOIN_ONLY #include "fsm_msg_eos.h" #include "fsm_msg_cosmos.h" #include "fsm_msg_osmosis.h" @@ -284,3 +307,6 @@ void fsm_msgClearSession(ClearSession *msg) { #include "fsm_msg_tendermint.h" #include "fsm_msg_thorchain.h" #include "fsm_msg_mayachain.h" +#include "fsm_msg_tron.h" +#include "fsm_msg_ton.h" +#endif diff --git a/lib/firmware/fsm_msg_common.h b/lib/firmware/fsm_msg_common.h index 33cd3e10d..6688125da 100644 --- a/lib/firmware/fsm_msg_common.h +++ b/lib/firmware/fsm_msg_common.h @@ -2,9 +2,11 @@ void fsm_msgInitialize(Initialize *msg) { (void)msg; recovery_cipher_abort(); signing_abort(); +#if !BITCOIN_ONLY ethereum_signing_abort(); tendermint_signAbort(); eos_signingAbort(); +#endif session_clear(false); // do not clear PIN layoutHome(); fsm_msgGetFeatures(0); @@ -130,8 +132,13 @@ void fsm_msgGetCoinTable(GetCoinTable *msg) { resp->chunk_size = sizeof(resp->table) / sizeof(resp->table[0]); if (msg->has_start && msg->has_end) { - if (COINS_COUNT + TOKENS_COUNT <= msg->start || - COINS_COUNT + TOKENS_COUNT < msg->end || msg->end < msg->start || +#if BITCOIN_ONLY + uint32_t total_count = COINS_COUNT; +#else + uint32_t total_count = COINS_COUNT + TOKENS_COUNT; +#endif + if (total_count <= msg->start || + total_count < msg->end || msg->end < msg->start || resp->chunk_size < msg->end - msg->start) { fsm_sendFailure(FailureType_Failure_Other, "Incorrect GetCoinTable parameters"); @@ -141,7 +148,11 @@ void fsm_msgGetCoinTable(GetCoinTable *msg) { } resp->has_num_coins = true; +#if BITCOIN_ONLY + resp->num_coins = COINS_COUNT; +#else resp->num_coins = COINS_COUNT + TOKENS_COUNT; +#endif if (msg->has_start && msg->has_end) { resp->table_count = msg->end - msg->start; @@ -149,9 +160,12 @@ void fsm_msgGetCoinTable(GetCoinTable *msg) { for (size_t i = 0; i < msg->end - msg->start; i++) { if (msg->start + i < COINS_COUNT) { resp->table[i] = coins[msg->start + i]; - } else if (msg->start + i - COINS_COUNT < TOKENS_COUNT) { + } +#if !BITCOIN_ONLY + else if (msg->start + i - COINS_COUNT < TOKENS_COUNT) { coinFromToken(&resp->table[i], &tokens[msg->start + i - COINS_COUNT]); } +#endif } } @@ -186,15 +200,16 @@ void fsm_msgPing(Ping *msg) { flash_setModel(&message); } +#if !BITCOIN_ONLY const char *errMsgStr[NUM_AUTHERRS] = { "noerr", - "Authenticator secret storage full", - "Authenticator secret can't be decoded", - "Account name missing or too long, or seed/message string missing", - "Account not found", + "Authenticator secret storage full", + "Authenticator secret can't be decoded", + "Account name missing or too long, or seed/message string missing", + "Account not found", "Slot request out of range", - "Authenticator secret seed too large", - "passphrase incorrect for authdata", + "Authenticator secret seed too large", + "passphrase incorrect for authdata", "Auth secret unknown error", }; @@ -252,7 +267,7 @@ void fsm_msgPing(Ping *msg) { strcat(resp->message, authSlot); #else resp->has_message = false; - #endif + #endif break; case GETACC: @@ -284,7 +299,9 @@ void fsm_msgPing(Ping *msg) { return; } - } else { + } else +#endif + { if (msg->has_button_protection && msg->button_protection) if (!confirm(ButtonRequestType_ButtonRequest_Ping, "Ping", "%s", @@ -545,9 +562,11 @@ void fsm_msgCancel(Cancel *msg) { (void)msg; recovery_cipher_abort(); signing_abort(); +#if !BITCOIN_ONLY ethereum_signing_abort(); tendermint_signAbort(); eos_signingAbort(); +#endif fsm_sendFailure(FailureType_Failure_ActionCancelled, "Aborted"); } diff --git a/lib/firmware/fsm_msg_ton.h b/lib/firmware/fsm_msg_ton.h new file mode 100644 index 000000000..10972ec37 --- /dev/null +++ b/lib/firmware/fsm_msg_ton.h @@ -0,0 +1,137 @@ +/* + * This file is part of the KeepKey project. + * + * Copyright (C) 2024 KeepKey + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library. If not, see . + */ + +void fsm_msgTonGetAddress(const TonGetAddress *msg) { + RESP_INIT(TonAddress); + + CHECK_INITIALIZED + + CHECK_PIN + + // Validate path: m/44'/607'/x'/x'/x'/x' (all hardened for TON) + if (msg->address_n_count < 6) { + fsm_sendFailure(FailureType_Failure_Other, + _("Invalid path for TON address")); + layoutHome(); + return; + } + + // Derive node using Ed25519 curve + HDNode *node = fsm_getDerivedNode(ED25519_NAME, msg->address_n, + msg->address_n_count, NULL); + if (!node) return; + hdnode_fill_public_key(node); + + // Extract TON-specific parameters with defaults + bool bounceable = msg->has_bounceable ? msg->bounceable : true; + bool testnet = msg->has_testnet ? msg->testnet : false; + int32_t workchain = msg->has_workchain ? msg->workchain : 0; + + // Get TON address from public key (Base64 URL-safe encoding) + char address[MAX_ADDR_SIZE]; + char raw_address[MAX_ADDR_SIZE]; + if (!ton_get_address(&node->public_key[1], bounceable, testnet, workchain, + address, sizeof(address), raw_address, + sizeof(raw_address))) { + memzero(node, sizeof(*node)); + fsm_sendFailure(FailureType_Failure_Other, _("Can't encode address")); + layoutHome(); + return; + } + + resp->has_address = true; + strlcpy(resp->address, address, sizeof(resp->address)); + resp->has_raw_address = true; + strlcpy(resp->raw_address, raw_address, sizeof(resp->raw_address)); + + // Show address on display if requested + if (msg->has_show_display && msg->show_display) { + char node_str[NODE_STRING_LENGTH]; + if (!bip32_path_to_string(node_str, sizeof(node_str), msg->address_n, + msg->address_n_count)) { + memset(node_str, 0, sizeof(node_str)); + } + + if (!confirm_ethereum_address(node_str, resp->address)) { + memzero(node, sizeof(*node)); + fsm_sendFailure(FailureType_Failure_ActionCancelled, + _("Show address cancelled")); + layoutHome(); + return; + } + } + + memzero(node, sizeof(*node)); + msg_write(MessageType_MessageType_TonAddress, resp); + layoutHome(); +} + +void fsm_msgTonSignTx(TonSignTx *msg) { + RESP_INIT(TonSignedTx); + + CHECK_INITIALIZED + + CHECK_PIN + + // Derive node using Ed25519 curve + HDNode *node = fsm_getDerivedNode(ED25519_NAME, msg->address_n, + msg->address_n_count, NULL); + if (!node) return; + hdnode_fill_public_key(node); + + if (!msg->has_raw_tx || msg->raw_tx.size == 0) { + memzero(node, sizeof(*node)); + fsm_sendFailure(FailureType_Failure_Other, + _("Missing transaction data")); + layoutHome(); + return; + } + + bool needs_confirm = true; + + // Display transaction details if available + if (needs_confirm && msg->has_to_address && msg->has_amount) { + char amount_str[32]; + ton_formatAmount(amount_str, sizeof(amount_str), msg->amount); + + if (!confirm(ButtonRequestType_ButtonRequest_ConfirmOutput, + "Send", "Send %s TON to %s?", + amount_str, msg->to_address)) { + memzero(node, sizeof(*node)); + fsm_sendFailure(FailureType_Failure_ActionCancelled, "Signing cancelled"); + layoutHome(); + return; + } + } + + if (!confirm(ButtonRequestType_ButtonRequest_SignTx, "Transaction", + "Really sign this TON transaction?")) { + memzero(node, sizeof(*node)); + fsm_sendFailure(FailureType_Failure_ActionCancelled, "Signing cancelled"); + layoutHome(); + return; + } + + // Sign the transaction with Ed25519 + ton_signTx(node, msg, resp); + + memzero(node, sizeof(*node)); + msg_write(MessageType_MessageType_TonSignedTx, resp); + layoutHome(); +} diff --git a/lib/firmware/fsm_msg_tron.h b/lib/firmware/fsm_msg_tron.h new file mode 100644 index 000000000..d7b96be10 --- /dev/null +++ b/lib/firmware/fsm_msg_tron.h @@ -0,0 +1,127 @@ +/* + * This file is part of the KeepKey project. + * + * Copyright (C) 2024 KeepKey + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library. If not, see . + */ + +void fsm_msgTronGetAddress(const TronGetAddress *msg) { + RESP_INIT(TronAddress); + + CHECK_INITIALIZED + + CHECK_PIN + + // Validate path: m/44'/195'/x'/0/0 + if (msg->address_n_count < 3) { + fsm_sendFailure(FailureType_Failure_Other, + _("Invalid path for TRON address")); + layoutHome(); + return; + } + + // Derive node using secp256k1 curve + HDNode *node = fsm_getDerivedNode(SECP256K1_NAME, msg->address_n, + msg->address_n_count, NULL); + if (!node) return; + hdnode_fill_public_key(node); + + // Get TRON address from public key (Base58Check with prefix 'T') + char address[MAX_ADDR_SIZE]; + if (!tron_getAddress(node->public_key, address, sizeof(address))) { + memzero(node, sizeof(*node)); + fsm_sendFailure(FailureType_Failure_Other, _("Address derivation failed")); + layoutHome(); + return; + } + + resp->has_address = true; + strlcpy(resp->address, address, sizeof(resp->address)); + + // Show address on display if requested + if (msg->has_show_display && msg->show_display) { + char node_str[NODE_STRING_LENGTH]; + if (!bip32_path_to_string(node_str, sizeof(node_str), msg->address_n, + msg->address_n_count)) { + memset(node_str, 0, sizeof(node_str)); + } + + if (!confirm_ethereum_address(node_str, resp->address)) { + memzero(node, sizeof(*node)); + fsm_sendFailure(FailureType_Failure_ActionCancelled, + _("Show address cancelled")); + layoutHome(); + return; + } + } + + memzero(node, sizeof(*node)); + msg_write(MessageType_MessageType_TronAddress, resp); + layoutHome(); +} + +void fsm_msgTronSignTx(TronSignTx *msg) { + RESP_INIT(TronSignedTx); + + CHECK_INITIALIZED + + CHECK_PIN + + // Derive node using secp256k1 curve + HDNode *node = fsm_getDerivedNode(SECP256K1_NAME, msg->address_n, + msg->address_n_count, NULL); + if (!node) return; + hdnode_fill_public_key(node); + + if (!msg->has_raw_data || msg->raw_data.size == 0) { + memzero(node, sizeof(*node)); + fsm_sendFailure(FailureType_Failure_Other, + _("Missing transaction data")); + layoutHome(); + return; + } + + bool needs_confirm = true; + + // Display transaction details if available + if (needs_confirm && msg->has_to_address && msg->has_amount) { + char amount_str[32]; + tron_formatAmount(amount_str, sizeof(amount_str), msg->amount); + + if (!confirm(ButtonRequestType_ButtonRequest_ConfirmOutput, + "Send", "Send %s TRX to %s?", + amount_str, msg->to_address)) { + memzero(node, sizeof(*node)); + fsm_sendFailure(FailureType_Failure_ActionCancelled, "Signing cancelled"); + layoutHome(); + return; + } + } + + if (!confirm(ButtonRequestType_ButtonRequest_SignTx, "Transaction", + "Really sign this TRON transaction?")) { + memzero(node, sizeof(*node)); + fsm_sendFailure(FailureType_Failure_ActionCancelled, "Signing cancelled"); + layoutHome(); + return; + } + + // Sign the transaction with secp256k1 + tron_signTx(node, msg, resp); + + memzero(node, sizeof(*node)); + msg_write(MessageType_MessageType_TronSignedTx, resp); + layoutHome(); +} diff --git a/lib/firmware/messagemap.def b/lib/firmware/messagemap.def index e8e374386..05d294e48 100644 --- a/lib/firmware/messagemap.def +++ b/lib/firmware/messagemap.def @@ -33,45 +33,41 @@ MSG_IN(MessageType_MessageType_RecoveryDevice, RecoveryDevice, fsm_msgRecoveryDevice) MSG_IN(MessageType_MessageType_CharacterAck, CharacterAck, fsm_msgCharacterAck) MSG_IN(MessageType_MessageType_ApplyPolicies, ApplyPolicies, fsm_msgApplyPolicies) +#if !BITCOIN_ONLY MSG_IN(MessageType_MessageType_EthereumGetAddress, EthereumGetAddress, fsm_msgEthereumGetAddress) MSG_IN(MessageType_MessageType_EthereumSignTx, EthereumSignTx, fsm_msgEthereumSignTx) MSG_IN(MessageType_MessageType_EthereumTxAck, EthereumTxAck, fsm_msgEthereumTxAck) MSG_IN(MessageType_MessageType_EthereumSignMessage, EthereumSignMessage, fsm_msgEthereumSignMessage) MSG_IN(MessageType_MessageType_EthereumVerifyMessage, EthereumVerifyMessage, fsm_msgEthereumVerifyMessage) - MSG_IN(MessageType_MessageType_EthereumSignTypedHash, EthereumSignTypedHash, fsm_msgEthereumSignTypedHash) - MSG_IN(MessageType_MessageType_Ethereum712TypesValues, Ethereum712TypesValues, fsm_msgEthereum712TypesValues) - MSG_IN(MessageType_MessageType_NanoGetAddress, NanoGetAddress, fsm_msgNanoGetAddress) MSG_IN(MessageType_MessageType_NanoSignTx, NanoSignTx, fsm_msgNanoSignTx) - MSG_IN(MessageType_MessageType_CosmosGetAddress, CosmosGetAddress, fsm_msgCosmosGetAddress) MSG_IN(MessageType_MessageType_CosmosSignTx, CosmosSignTx, fsm_msgCosmosSignTx) MSG_IN(MessageType_MessageType_CosmosMsgAck, CosmosMsgAck, fsm_msgCosmosMsgAck) - MSG_IN(MessageType_MessageType_OsmosisGetAddress, OsmosisGetAddress, fsm_msgOsmosisGetAddress) MSG_IN(MessageType_MessageType_OsmosisSignTx, OsmosisSignTx, fsm_msgOsmosisSignTx) MSG_IN(MessageType_MessageType_OsmosisMsgAck, OsmosisMsgAck, fsm_msgOsmosisMsgAck) - MSG_IN(MessageType_MessageType_BinanceGetAddress, BinanceGetAddress, fsm_msgBinanceGetAddress) MSG_IN(MessageType_MessageType_BinanceSignTx, BinanceSignTx, fsm_msgBinanceSignTx) MSG_IN(MessageType_MessageType_BinanceTransferMsg, BinanceTransferMsg, fsm_msgBinanceTransferMsg) - MSG_IN(MessageType_MessageType_EosGetPublicKey, EosGetPublicKey, fsm_msgEosGetPublicKey) MSG_IN(MessageType_MessageType_EosSignTx, EosSignTx, fsm_msgEosSignTx) MSG_IN(MessageType_MessageType_EosTxActionAck, EosTxActionAck, fsm_msgEosTxActionAck) - MSG_IN(MessageType_MessageType_RippleGetAddress, RippleGetAddress, fsm_msgRippleGetAddress) MSG_IN(MessageType_MessageType_RippleSignTx, RippleSignTx, fsm_msgRippleSignTx) - MSG_IN(MessageType_MessageType_ThorchainGetAddress, ThorchainGetAddress, fsm_msgThorchainGetAddress) MSG_IN(MessageType_MessageType_ThorchainSignTx, ThorchainSignTx, fsm_msgThorchainSignTx) MSG_IN(MessageType_MessageType_ThorchainMsgAck, ThorchainMsgAck, fsm_msgThorchainMsgAck) - MSG_IN(MessageType_MessageType_MayachainGetAddress, MayachainGetAddress, fsm_msgMayachainGetAddress) MSG_IN(MessageType_MessageType_MayachainSignTx, MayachainSignTx, fsm_msgMayachainSignTx) MSG_IN(MessageType_MessageType_MayachainMsgAck, MayachainMsgAck, fsm_msgMayachainMsgAck) + MSG_IN(MessageType_MessageType_TronGetAddress, TronGetAddress, fsm_msgTronGetAddress) + MSG_IN(MessageType_MessageType_TronSignTx, TronSignTx, fsm_msgTronSignTx) + MSG_IN(MessageType_MessageType_TonGetAddress, TonGetAddress, fsm_msgTonGetAddress) + MSG_IN(MessageType_MessageType_TonSignTx, TonSignTx, fsm_msgTonSignTx) +#endif /* Normal Out Messages */ MSG_OUT(MessageType_MessageType_Success, Success, NO_PROCESS_FUNC) @@ -95,42 +91,39 @@ MSG_OUT(MessageType_MessageType_PassphraseRequest, PassphraseRequest, NO_PROCESS_FUNC) MSG_OUT(MessageType_MessageType_WordRequest, WordRequest, NO_PROCESS_FUNC) MSG_OUT(MessageType_MessageType_CharacterRequest, CharacterRequest, NO_PROCESS_FUNC) +#if !BITCOIN_ONLY MSG_OUT(MessageType_MessageType_EthereumAddress, EthereumAddress, NO_PROCESS_FUNC) MSG_OUT(MessageType_MessageType_EthereumTxRequest, EthereumTxRequest, NO_PROCESS_FUNC) MSG_OUT(MessageType_MessageType_EthereumMessageSignature, EthereumMessageSignature, NO_PROCESS_FUNC) - MSG_OUT(MessageType_MessageType_EthereumTypedDataSignature, EthereumTypedDataSignature, NO_PROCESS_FUNC) - MSG_OUT(MessageType_MessageType_NanoAddress, NanoAddress, NO_PROCESS_FUNC) MSG_OUT(MessageType_MessageType_NanoSignedTx, NanoSignedTx, NO_PROCESS_FUNC) - MSG_OUT(MessageType_MessageType_CosmosAddress, CosmosAddress, NO_PROCESS_FUNC) MSG_OUT(MessageType_MessageType_CosmosMsgRequest, CosmosMsgRequest, NO_PROCESS_FUNC) MSG_OUT(MessageType_MessageType_CosmosSignedTx, CosmosSignedTx, NO_PROCESS_FUNC) - MSG_OUT(MessageType_MessageType_OsmosisAddress, OsmosisAddress, NO_PROCESS_FUNC) MSG_OUT(MessageType_MessageType_OsmosisMsgRequest, OsmosisMsgRequest, NO_PROCESS_FUNC) MSG_OUT(MessageType_MessageType_OsmosisSignedTx, OsmosisSignedTx, NO_PROCESS_FUNC) - MSG_OUT(MessageType_MessageType_BinanceAddress, BinanceAddress, NO_PROCESS_FUNC) MSG_OUT(MessageType_MessageType_BinancePublicKey, BinancePublicKey, NO_PROCESS_FUNC) MSG_OUT(MessageType_MessageType_BinanceTxRequest, BinanceTxRequest, NO_PROCESS_FUNC) MSG_OUT(MessageType_MessageType_BinanceSignedTx, BinanceSignedTx, NO_PROCESS_FUNC) - MSG_OUT(MessageType_MessageType_EosPublicKey, EosPublicKey, NO_PROCESS_FUNC) MSG_OUT(MessageType_MessageType_EosTxActionRequest, EosTxActionRequest, NO_PROCESS_FUNC) MSG_OUT(MessageType_MessageType_EosSignedTx, EosSignedTx, NO_PROCESS_FUNC) - MSG_OUT(MessageType_MessageType_RippleAddress, RippleAddress, NO_PROCESS_FUNC) MSG_OUT(MessageType_MessageType_RippleSignedTx, RippleSignedTx, NO_PROCESS_FUNC) - MSG_OUT(MessageType_MessageType_ThorchainAddress, ThorchainAddress, NO_PROCESS_FUNC) MSG_OUT(MessageType_MessageType_ThorchainMsgRequest, ThorchainMsgRequest, NO_PROCESS_FUNC) MSG_OUT(MessageType_MessageType_ThorchainSignedTx, ThorchainSignedTx, NO_PROCESS_FUNC) - MSG_OUT(MessageType_MessageType_MayachainAddress, MayachainAddress, NO_PROCESS_FUNC) MSG_OUT(MessageType_MessageType_MayachainMsgRequest, MayachainMsgRequest, NO_PROCESS_FUNC) MSG_OUT(MessageType_MessageType_MayachainSignedTx, MayachainSignedTx, NO_PROCESS_FUNC) + MSG_OUT(MessageType_MessageType_TronAddress, TronAddress, NO_PROCESS_FUNC) + MSG_OUT(MessageType_MessageType_TronSignedTx, TronSignedTx, NO_PROCESS_FUNC) + MSG_OUT(MessageType_MessageType_TonAddress, TonAddress, NO_PROCESS_FUNC) + MSG_OUT(MessageType_MessageType_TonSignedTx, TonSignedTx, NO_PROCESS_FUNC) +#endif #if DEBUG_LINK /* Debug Messages */ diff --git a/lib/firmware/ton.c b/lib/firmware/ton.c new file mode 100644 index 000000000..3549c189a --- /dev/null +++ b/lib/firmware/ton.c @@ -0,0 +1,175 @@ +/* + * This file is part of the KeepKey project. + * + * Copyright (C) 2024 KeepKey + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library. If not, see . + */ + +#include "keepkey/firmware/ton.h" + +#include "trezor/crypto/ed25519-donna/ed25519.h" +#include "trezor/crypto/hasher.h" +#include "trezor/crypto/memzero.h" +#include "trezor/crypto/sha2.h" + +#include +#include + +// Base64 URL-safe alphabet (RFC 4648) +static const char base64_url_alphabet[] = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_"; + +/** + * Encode data to Base64 URL-safe format (without padding) + */ +static bool base64_url_encode(const uint8_t *data, size_t data_len, char *out, + size_t out_len) { + size_t required_len = ((data_len + 2) / 3) * 4; + if (out_len < required_len + 1) { + return false; + } + + size_t i = 0, j = 0; + while (i < data_len) { + uint32_t octet_a = i < data_len ? data[i++] : 0; + uint32_t octet_b = i < data_len ? data[i++] : 0; + uint32_t octet_c = i < data_len ? data[i++] : 0; + + uint32_t triple = (octet_a << 16) | (octet_b << 8) | octet_c; + + out[j++] = base64_url_alphabet[(triple >> 18) & 0x3F]; + out[j++] = base64_url_alphabet[(triple >> 12) & 0x3F]; + out[j++] = base64_url_alphabet[(triple >> 6) & 0x3F]; + out[j++] = base64_url_alphabet[triple & 0x3F]; + } + + // Remove padding for URL-safe variant + size_t padding = (3 - (data_len % 3)) % 3; + j -= padding; + out[j] = '\0'; + + return true; +} + +/** + * Compute CRC16-XMODEM checksum for TON address + */ +static uint16_t ton_crc16(const uint8_t *data, size_t len) { + uint16_t crc = 0; + + for (size_t i = 0; i < len; i++) { + crc ^= (uint16_t)data[i] << 8; + for (int j = 0; j < 8; j++) { + if (crc & 0x8000) { + crc = (crc << 1) ^ 0x1021; + } else { + crc <<= 1; + } + } + } + + return crc; +} + +/** + * Generate TON address from Ed25519 public key + * TON uses a specific format with workchain, bounceable/testnet flags, and + * CRC16 + */ +bool ton_get_address(const ed25519_public_key public_key, bool bounceable, + bool testnet, int32_t workchain, char *address, + size_t address_len, char *raw_address, + size_t raw_address_len) { + if (address_len < TON_ADDRESS_MAX_LEN || + raw_address_len < TON_RAW_ADDRESS_MAX_LEN) { + return false; + } + + // Hash the public key with SHA256 + uint8_t hash[32]; + sha256_Raw(public_key, 32, hash); + + // Construct address data: [tag][workchain][hash][crc16] + uint8_t addr_data[36]; + uint8_t tag = 0x11; // Base tag + if (bounceable) tag |= 0x11; + if (testnet) tag |= 0x80; + + addr_data[0] = tag; + addr_data[1] = (uint8_t)workchain; + memcpy(addr_data + 2, hash, 32); + + // Compute CRC16 checksum + uint16_t crc = ton_crc16(addr_data, 34); + addr_data[34] = (crc >> 8) & 0xFF; + addr_data[35] = crc & 0xFF; + + // Encode to Base64 URL-safe + if (!base64_url_encode(addr_data, 36, address, address_len)) { + memzero(hash, sizeof(hash)); + memzero(addr_data, sizeof(addr_data)); + return false; + } + + // Generate raw address format: workchain:hash_hex + char hash_hex[65]; + for (int i = 0; i < 32; i++) { + snprintf(hash_hex + (i * 2), 3, "%02x", hash[i]); + } + snprintf(raw_address, raw_address_len, "%ld:%s", (long)workchain, hash_hex); + + // Clean up sensitive data + memzero(hash, sizeof(hash)); + memzero(addr_data, sizeof(addr_data)); + + return true; +} + +/** + * Format TON amount (nanoTON) for display + * 1 TON = 1,000,000,000 nanoTON + */ +void ton_formatAmount(char *buf, size_t len, uint64_t amount) { + bignum256 val; + bn_read_uint64(amount, &val); + bn_format(&val, NULL, " TON", TON_DECIMALS, 0, false, buf, len); +} + +/** + * Sign a TON transaction with Ed25519 + */ +void ton_signTx(const HDNode *node, const TonSignTx *msg, TonSignedTx *resp) { + if (!node || !msg || !resp) { + return; + } + + // Verify we have raw transaction data + if (!msg->has_raw_tx || msg->raw_tx.size == 0) { + return; + } + + // Ed25519 sign the transaction + ed25519_signature signature; + ed25519_sign(msg->raw_tx.bytes, msg->raw_tx.size, node->private_key, + &node->public_key[1], signature); + + // Copy signature to response (64 bytes) + resp->has_signature = true; + resp->signature.size = 64; + memcpy(resp->signature.bytes, signature, 64); + + // Zero out the signature buffer for security + memzero(signature, sizeof(signature)); +} diff --git a/lib/firmware/transaction.c b/lib/firmware/transaction.c index aa37285e0..54747372c 100644 --- a/lib/firmware/transaction.c +++ b/lib/firmware/transaction.c @@ -27,7 +27,9 @@ #include "keepkey/firmware/coins.h" #include "keepkey/firmware/crypto.h" #include "keepkey/firmware/signing.h" +#if !BITCOIN_ONLY #include "keepkey/firmware/thorchain.h" +#endif #include "keepkey/firmware/txin_check.h" #include "keepkey/transport/interface.h" #include "trezor/crypto/address.h" @@ -237,8 +239,11 @@ int compile_output(const CoinType *coin, const HDNode *root, TxOutputType *in, return -1; // user aborted } } else { +#if !BITCOIN_ONLY // is this thorchain data? - if (!thorchain_parseConfirmMemo((const char *)in->op_return_data.bytes, (size_t)in->op_return_data.size)) { + if (!thorchain_parseConfirmMemo((const char *)in->op_return_data.bytes, (size_t)in->op_return_data.size)) +#endif + { if (!confirm_data(ButtonRequestType_ButtonRequest_ConfirmOutput, _("Confirm OP_RETURN"), in->op_return_data.bytes, in->op_return_data.size)) { diff --git a/lib/firmware/tron.c b/lib/firmware/tron.c new file mode 100644 index 000000000..3ad0e2051 --- /dev/null +++ b/lib/firmware/tron.c @@ -0,0 +1,128 @@ +/* + * This file is part of the KeepKey project. + * + * Copyright (C) 2024 KeepKey + * + * This library is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library. If not, see . + */ + +#include "keepkey/firmware/tron.h" + +#include "keepkey/crypto/curves.h" +#include "trezor/crypto/base58.h" +#include "trezor/crypto/ecdsa.h" +#include "trezor/crypto/memzero.h" +#include "trezor/crypto/secp256k1.h" +#include "trezor/crypto/sha3.h" + +#include + +#define TRON_ADDRESS_PREFIX 0x41 // Mainnet addresses start with 'T' + +/** + * Generate TRON address from secp256k1 public key + * TRON uses Keccak256(uncompressed_pubkey) and takes last 20 bytes, + * then prepends 0x41 and Base58Check encodes it + */ +bool tron_getAddress(const uint8_t public_key[33], char *address, + size_t address_len) { + if (address_len < TRON_ADDRESS_MAX_LEN) { + return false; + } + + uint8_t uncompressed_pubkey[65]; + uint8_t hash[32]; + uint8_t addr_bytes[21]; + + // Uncompress the public key + ecdsa_uncompress_pubkey(&secp256k1, public_key, uncompressed_pubkey); + + // Keccak256 hash of uncompressed public key (skip first 0x04 byte) + keccak_256(uncompressed_pubkey + 1, 64, hash); + + // Take last 20 bytes of hash and prepend TRON prefix byte + addr_bytes[0] = TRON_ADDRESS_PREFIX; + memcpy(addr_bytes + 1, hash + 12, 20); + + // Base58Check encode with double SHA256 + if (!base58_encode_check(addr_bytes, 21, HASHER_SHA2D, address, + address_len)) { + return false; + } + + // Clean up sensitive data + memzero(uncompressed_pubkey, sizeof(uncompressed_pubkey)); + memzero(hash, sizeof(hash)); + + return true; +} + +/** + * Format TRON amount (SUN) for display + * 1 TRX = 1,000,000 SUN + */ +void tron_formatAmount(char *buf, size_t len, uint64_t amount) { + bignum256 val; + bn_read_uint64(amount, &val); + bn_format(&val, NULL, " TRX", TRON_DECIMALS, 0, false, buf, len); +} + +/** + * Sign a TRON transaction with secp256k1 + */ +void tron_signTx(const HDNode *node, const TronSignTx *msg, + TronSignedTx *resp) { + if (!node || !msg || !resp) { + return; + } + + // Verify we have raw transaction data + if (!msg->has_raw_data || msg->raw_data.size == 0) { + return; + } + + // Get the curve for secp256k1 + const curve_info *curve = get_curve_by_name(SECP256K1_NAME); + if (!curve) { + return; + } + + // Hash the transaction with SHA256 + uint8_t hash[32]; + sha256_Raw(msg->raw_data.bytes, msg->raw_data.size, hash); + + // Sign with secp256k1 (recoverable signature: 65 bytes including recovery + // ID) + uint8_t sig[65]; + uint8_t pby; + + if (ecdsa_sign_digest(&secp256k1, node->private_key, hash, sig, &pby, + NULL) != 0) { + memzero(hash, sizeof(hash)); + return; + } + + // Convert to recoverable signature format (r + s + recovery_id) + // The recovery ID allows recovering the public key from the signature + sig[64] = pby; + + // Copy signature to response (65 bytes) + resp->has_signature = true; + resp->signature.size = 65; + memcpy(resp->signature.bytes, sig, 65); + + // Clean up sensitive data + memzero(hash, sizeof(hash)); + memzero(sig, sizeof(sig)); +} diff --git a/lib/transport/CMakeLists.txt b/lib/transport/CMakeLists.txt index 41b8d5864..9ea4c298e 100644 --- a/lib/transport/CMakeLists.txt +++ b/lib/transport/CMakeLists.txt @@ -15,6 +15,8 @@ set(protoc_pb_sources ${DEVICE_PROTOCOL}/messages-tendermint.proto ${DEVICE_PROTOCOL}/messages-thorchain.proto ${DEVICE_PROTOCOL}/messages-mayachain.proto + ${DEVICE_PROTOCOL}/messages-tron.proto + ${DEVICE_PROTOCOL}/messages-ton.proto ${DEVICE_PROTOCOL}/messages.proto) set(protoc_pb_options @@ -29,6 +31,8 @@ set(protoc_pb_options ${CMAKE_SOURCE_DIR}/include/keepkey/transport/messages-tendermint.options ${CMAKE_SOURCE_DIR}/include/keepkey/transport/messages-thorchain.options ${CMAKE_SOURCE_DIR}/include/keepkey/transport/messages-mayachain.options + ${CMAKE_SOURCE_DIR}/include/keepkey/transport/messages-tron.options + ${CMAKE_SOURCE_DIR}/include/keepkey/transport/messages-ton.options ${CMAKE_SOURCE_DIR}/include/keepkey/transport/messages.options) set(protoc_c_sources @@ -43,6 +47,8 @@ set(protoc_c_sources ${CMAKE_BINARY_DIR}/lib/transport/messages-tendermint.pb.c ${CMAKE_BINARY_DIR}/lib/transport/messages-thorchain.pb.c ${CMAKE_BINARY_DIR}/lib/transport/messages-mayachain.pb.c + ${CMAKE_BINARY_DIR}/lib/transport/messages-tron.pb.c + ${CMAKE_BINARY_DIR}/lib/transport/messages-ton.pb.c ${CMAKE_BINARY_DIR}/lib/transport/messages.pb.c) set(protoc_c_headers @@ -57,6 +63,8 @@ set(protoc_c_headers ${CMAKE_BINARY_DIR}/include/messages-tendermint.pb.h ${CMAKE_BINARY_DIR}/include/messages-thorchain.pb.h ${CMAKE_BINARY_DIR}/include/messages-mayachain.pb.h + ${CMAKE_BINARY_DIR}/include/messages-tron.pb.h + ${CMAKE_BINARY_DIR}/include/messages-ton.pb.h ${CMAKE_BINARY_DIR}/include/messages.pb.h) set(protoc_pb_sources_moved @@ -71,6 +79,8 @@ set(protoc_pb_sources_moved ${CMAKE_BINARY_DIR}/lib/transport/messages-tendermint.proto ${CMAKE_BINARY_DIR}/lib/transport/messages-thorchain.proto ${CMAKE_BINARY_DIR}/lib/transport/messages-mayachain.proto + ${CMAKE_BINARY_DIR}/lib/transport/messages-tron.proto + ${CMAKE_BINARY_DIR}/lib/transport/messages-ton.proto ${CMAKE_BINARY_DIR}/lib/transport/messages.proto) add_custom_command( @@ -136,6 +146,14 @@ add_custom_command( ${PROTOC_BINARY} -I. -I/usr/include --plugin=nanopb=${NANOPB_DIR}/generator/protoc-gen-nanopb "--nanopb_out=-f messages-mayachain.options:." messages-mayachain.proto + COMMAND + ${PROTOC_BINARY} -I. -I/usr/include + --plugin=nanopb=${NANOPB_DIR}/generator/protoc-gen-nanopb + "--nanopb_out=-f messages-tron.options:." messages-tron.proto + COMMAND + ${PROTOC_BINARY} -I. -I/usr/include + --plugin=nanopb=${NANOPB_DIR}/generator/protoc-gen-nanopb + "--nanopb_out=-f messages-ton.options:." messages-ton.proto COMMAND ${PROTOC_BINARY} -I. -I/usr/include --plugin=nanopb=${NANOPB_DIR}/generator/protoc-gen-nanopb diff --git a/lib/variant/CMakeLists.txt b/lib/variant/CMakeLists.txt index 0728f3f28..df997443b 100644 --- a/lib/variant/CMakeLists.txt +++ b/lib/variant/CMakeLists.txt @@ -7,10 +7,6 @@ add_library(kkvariant.keepkey ${CMAKE_CURRENT_SOURCE_DIR}/keepkey/keepkey.c ${CMAKE_CURRENT_SOURCE_DIR}/keepkey/logo.c) -add_library(kkvariant.salt - ${CMAKE_CURRENT_SOURCE_DIR}/salt/salt.c - ${CMAKE_CURRENT_SOURCE_DIR}/salt/logo.c) - add_library(kkvariant.poweredBy ${CMAKE_CURRENT_SOURCE_DIR}/poweredBy/poweredBy.c ${CMAKE_CURRENT_SOURCE_DIR}/poweredBy/logo.c) diff --git a/lib/variant/salt/logo.c b/lib/variant/salt/logo.c deleted file mode 100644 index 6884c0684..000000000 --- a/lib/variant/salt/logo.c +++ /dev/null @@ -1,317 +0,0 @@ -/* - * This file is part of the KeepKey project. - * - * Copyright (C) 2015 KeepKey LLC - * - * This library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see . - */ - -#include "keepkey/board/resources.h" - -const uint8_t salt_logo_1_data[1915] = { - 0x7f, 0x0, 0x3a, 0x0, 0xff, 0x1, 0x6, 0x2, 0xff, 0x1, 0x59, 0x0, - 0xfe, 0x1, 0x3, 0x3, 0x2, 0x22, 0x0, 0xff, 0x1, 0x1a, 0x2, 0x9, - 0x0, 0xf2, 0x1, 0x5, 0xd, 0x31, 0x5f, 0x79, 0x84, 0x83, 0x78, 0x5f, - 0x35, 0xf, 0x6, 0x3, 0x2b, 0x0, 0xfe, 0x19, 0x18, 0x28, 0x0, 0xf9, - 0x3, 0x36, 0x87, 0x81, 0x84, 0x65, 0x4, 0x21, 0x0, 0xfd, 0x33, 0x77, - 0x83, 0x16, 0x81, 0xfd, 0x85, 0x65, 0x14, 0x7, 0x0, 0xfc, 0xa, 0x38, - 0xa1, 0xed, 0x8, 0xff, 0xfb, 0xfa, 0xbd, 0x64, 0x16, 0x5, 0x28, 0x0, - 0xfd, 0x3, 0x90, 0x80, 0x28, 0x0, 0xfe, 0x5, 0x6d, 0x3, 0xff, 0xfe, - 0xcb, 0x8, 0x21, 0x0, 0xfe, 0x67, 0xef, 0x18, 0xff, 0xfe, 0xcb, 0x27, - 0x5, 0x0, 0xfd, 0x1, 0x24, 0xa8, 0xe, 0xff, 0xfc, 0xf2, 0x7d, 0x15, - 0x2, 0x26, 0x0, 0xfc, 0x3c, 0xdc, 0xc4, 0x2a, 0x27, 0x0, 0xfe, 0x5, - 0x6b, 0x3, 0xff, 0xfe, 0xc7, 0x8, 0x21, 0x0, 0xfe, 0x65, 0xeb, 0x18, - 0xff, 0xfe, 0xc8, 0x27, 0x4, 0x0, 0xfd, 0x2, 0x3f, 0xe6, 0x4, 0xff, - 0xf9, 0xfd, 0xf6, 0xf2, 0xf1, 0xf2, 0xf4, 0xf9, 0x6, 0xff, 0xfd, 0xdb, - 0x3d, 0x5, 0x25, 0x0, 0xff, 0x7d, 0x2, 0xff, 0xff, 0x67, 0x27, 0x0, - 0xfe, 0x5, 0x6b, 0x3, 0xff, 0xfe, 0xc7, 0x8, 0x21, 0x0, 0xfd, 0x61, - 0xe0, 0xf6, 0x8, 0xf4, 0xff, 0xf7, 0x3, 0xff, 0xfe, 0xfd, 0xf5, 0x8, - 0xf4, 0xfd, 0xfb, 0xbf, 0x25, 0x4, 0x0, 0xfe, 0x31, 0xf0, 0x3, 0xff, - 0xf4, 0xfb, 0xe7, 0xb9, 0x79, 0x57, 0x4d, 0x55, 0x6c, 0x95, 0xca, 0xe8, - 0xf6, 0x5, 0xff, 0xff, 0x5a, 0x24, 0x0, 0xfe, 0x33, 0xcb, 0x2, 0xff, - 0xfe, 0xb4, 0x22, 0x26, 0x0, 0xfe, 0x5, 0x6b, 0x3, 0xff, 0xfe, 0xc7, - 0x8, 0x21, 0x0, 0xfd, 0x29, 0x60, 0x6a, 0x7, 0x69, 0xfe, 0x6a, 0x96, - 0x3, 0xff, 0xfd, 0xea, 0x78, 0x67, 0x7, 0x69, 0xfd, 0x6c, 0x52, 0x10, - 0x3, 0x0, 0xfe, 0x10, 0xc5, 0x3, 0xff, 0xfd, 0xf7, 0xad, 0x29, 0x8, - 0x0, 0xfc, 0x25, 0x87, 0xda, 0xfa, 0x3, 0xff, 0xfe, 0xcb, 0x1, 0x23, - 0x0, 0xff, 0x70, 0x3, 0xff, 0xfe, 0xfd, 0x5a, 0x26, 0x0, 0xfe, 0x5, - 0x6b, 0x3, 0xff, 0xfe, 0xc7, 0x8, 0x2c, 0x0, 0xff, 0x48, 0x3, 0xff, - 0xfe, 0xda, 0x14, 0xd, 0x0, 0xfe, 0x2, 0x50, 0x3, 0xff, 0xfe, 0xf9, - 0x9c, 0xc, 0x0, 0xfa, 0x19, 0xa1, 0xef, 0xff, 0xdc, 0x1b, 0x23, 0x0, - 0xfe, 0x2a, 0xc2, 0x4, 0xff, 0xfe, 0xa9, 0x1b, 0x25, 0x0, 0xfe, 0x5, - 0x6b, 0x3, 0xff, 0xfe, 0xc7, 0x8, 0x2b, 0x0, 0xfe, 0x1, 0x4e, 0x3, - 0xff, 0xfe, 0xdb, 0x1b, 0xd, 0x0, 0xfe, 0x5, 0xb1, 0x3, 0xff, 0xfe, - 0xd1, 0x16, 0xe, 0x0, 0xfd, 0x76, 0xdc, 0x36, 0x24, 0x0, 0xff, 0x63, - 0x5, 0xff, 0xfe, 0xf8, 0x4e, 0x25, 0x0, 0xfe, 0x5, 0x6b, 0x3, 0xff, - 0xfe, 0xc7, 0x8, 0x2b, 0x0, 0xfe, 0x1, 0x4e, 0x3, 0xff, 0xfe, 0xdb, - 0x1b, 0xd, 0x0, 0xfe, 0x7, 0xe9, 0x2, 0xff, 0xfe, 0xfb, 0xa0, 0x10, - 0x0, 0xff, 0x24, 0x24, 0x0, 0xfe, 0x21, 0xb9, 0x6, 0xff, 0xfe, 0x9d, - 0x14, 0x24, 0x0, 0xfe, 0x5, 0x6b, 0x3, 0xff, 0xfe, 0xc7, 0x8, 0x2b, - 0x0, 0xfe, 0x1, 0x4e, 0x3, 0xff, 0xfe, 0xdb, 0x1b, 0xd, 0x0, 0xff, - 0x8, 0x3, 0xff, 0xfe, 0xf4, 0x82, 0x35, 0x0, 0xff, 0x55, 0x3, 0xff, - 0x2, 0xf9, 0x2, 0xff, 0xfe, 0xf2, 0x42, 0x24, 0x0, 0xfe, 0x5, 0x6b, - 0x3, 0xff, 0xfe, 0xc7, 0x8, 0x2b, 0x0, 0xfe, 0x1, 0x4e, 0x3, 0xff, - 0xfe, 0xdb, 0x1b, 0xd, 0x0, 0xfe, 0x8, 0xfe, 0x2, 0xff, 0xfe, 0xfa, - 0x9c, 0x34, 0x0, 0xfe, 0x1a, 0xae, 0x3, 0xff, 0xfe, 0xb8, 0xbe, 0x3, - 0xff, 0xfe, 0x8f, 0xf, 0x23, 0x0, 0xfe, 0x5, 0x6b, 0x3, 0xff, 0xfe, - 0xc7, 0x8, 0x2b, 0x0, 0xfe, 0x1, 0x4e, 0x3, 0xff, 0xfe, 0xdb, 0x1b, - 0xd, 0x0, 0xfe, 0x7, 0xde, 0x3, 0xff, 0xfe, 0xda, 0x29, 0x33, 0x0, - 0xfe, 0x49, 0xfe, 0x2, 0xff, 0xfc, 0xe7, 0x46, 0x5d, 0xf5, 0x2, 0xff, - 0xfe, 0xec, 0x37, 0x23, 0x0, 0xfe, 0x5, 0x6b, 0x3, 0xff, 0xfe, 0xc7, - 0x8, 0x2b, 0x0, 0xfe, 0x1, 0x4e, 0x3, 0xff, 0xfe, 0xdb, 0x1b, 0xd, - 0x0, 0xfe, 0x5, 0x9b, 0x3, 0xff, 0xfc, 0xfd, 0xbe, 0x36, 0x6, 0x30, - 0x0, 0xfe, 0x13, 0xa3, 0x3, 0xff, 0xfc, 0xa6, 0xa, 0x1d, 0xbb, 0x3, - 0xff, 0xfe, 0x82, 0xb, 0x22, 0x0, 0xfe, 0x5, 0x6b, 0x3, 0xff, 0xfe, - 0xc7, 0x8, 0x2b, 0x0, 0xfe, 0x1, 0x4e, 0x3, 0xff, 0xfe, 0xdb, 0x1b, - 0xd, 0x0, 0xfd, 0x1, 0x3d, 0xfd, 0x4, 0xff, 0xfc, 0xdf, 0x7a, 0x3e, - 0x1b, 0x2e, 0x0, 0xfe, 0x3e, 0xf9, 0x2, 0xff, 0xfe, 0xec, 0x5f, 0x2, - 0x0, 0xfe, 0x77, 0xf8, 0x2, 0xff, 0xfe, 0xe6, 0x2c, 0x22, 0x0, 0xfe, - 0x5, 0x6b, 0x3, 0xff, 0xfe, 0xc7, 0x8, 0x2b, 0x0, 0xfe, 0x1, 0x4e, - 0x3, 0xff, 0xfe, 0xdb, 0x1b, 0xe, 0x0, 0xfe, 0x3, 0x93, 0x6, 0xff, - 0xfa, 0xe6, 0xa6, 0x70, 0x49, 0x2c, 0xd, 0x29, 0x0, 0xfe, 0xe, 0x96, - 0x3, 0xff, 0xfe, 0xb3, 0x14, 0x2, 0x0, 0xfe, 0x26, 0xc6, 0x3, 0xff, - 0xfe, 0x76, 0x8, 0x21, 0x0, 0xfe, 0x5, 0x6b, 0x3, 0xff, 0xfe, 0xc7, - 0x8, 0x2b, 0x0, 0xfe, 0x1, 0x4e, 0x3, 0xff, 0xfe, 0xdb, 0x1b, 0xf, - 0x0, 0xfd, 0x11, 0xa0, 0xfa, 0x7, 0xff, 0xfa, 0xec, 0xbf, 0x93, 0x66, - 0x40, 0x19, 0x26, 0x0, 0xfe, 0x33, 0xf4, 0x2, 0xff, 0xfe, 0xf0, 0x6c, - 0x4, 0x0, 0xfe, 0x85, 0xfa, 0x2, 0xff, 0xfe, 0xe0, 0x22, 0x21, 0x0, - 0xfe, 0x5, 0x6b, 0x3, 0xff, 0xfe, 0xc7, 0x8, 0x2b, 0x0, 0xfe, 0x1, - 0x4e, 0x3, 0xff, 0xfe, 0xdb, 0x1b, 0x10, 0x0, 0xfd, 0xe, 0x7b, 0xd2, - 0xa, 0xff, 0xfc, 0xd9, 0xa6, 0x70, 0x39, 0x23, 0x0, 0xfe, 0xa, 0x8a, - 0x3, 0xff, 0xfe, 0xbf, 0x19, 0x4, 0x0, 0xfe, 0x2d, 0xd0, 0x3, 0xff, - 0xfe, 0x69, 0x6, 0x20, 0x0, 0xfe, 0x5, 0x6b, 0x3, 0xff, 0xfe, 0xc7, - 0x8, 0x2b, 0x0, 0xfe, 0x1, 0x4e, 0x3, 0xff, 0xfe, 0xdb, 0x1b, 0x12, - 0x0, 0xfc, 0x3c, 0x87, 0xc2, 0xf2, 0xa, 0xff, 0xfd, 0xce, 0x89, 0x39, - 0x21, 0x0, 0xfe, 0x28, 0xef, 0x2, 0xff, 0xfe, 0xf4, 0x79, 0x6, 0x0, - 0xfe, 0x92, 0xfb, 0x2, 0xff, 0xfe, 0xd9, 0x18, 0x20, 0x0, 0xfe, 0x5, - 0x6b, 0x3, 0xff, 0xfe, 0xc7, 0x8, 0x2b, 0x0, 0xfe, 0x1, 0x4e, 0x3, - 0xff, 0xfe, 0xdb, 0x1b, 0x14, 0x0, 0xfb, 0x2d, 0x60, 0x90, 0xbd, 0xe9, - 0x9, 0xff, 0xfd, 0xcd, 0x6c, 0x2, 0x1e, 0x0, 0xfe, 0x6, 0x7d, 0x3, - 0xff, 0xfe, 0xcb, 0x1e, 0x6, 0x0, 0xfe, 0x36, 0xda, 0x3, 0xff, 0xfe, - 0x5d, 0x4, 0x1f, 0x0, 0xfe, 0x5, 0x6b, 0x3, 0xff, 0xfe, 0xc7, 0x8, - 0x2b, 0x0, 0xfe, 0x1, 0x4e, 0x3, 0xff, 0xfe, 0xdb, 0x1b, 0x16, 0x0, - 0xf9, 0x4, 0x2b, 0x50, 0x75, 0x9e, 0xcc, 0xfc, 0x6, 0xff, 0xfe, 0xf5, - 0x83, 0x1e, 0x0, 0xfe, 0x1d, 0xe9, 0x2, 0xff, 0xfe, 0xf6, 0x86, 0x8, - 0x0, 0xfe, 0x9f, 0xfc, 0x2, 0xff, 0xfe, 0xd1, 0xf, 0x1f, 0x0, 0xfe, - 0x5, 0x6b, 0x3, 0xff, 0xfe, 0xc7, 0x8, 0x2b, 0x0, 0xfe, 0x1, 0x4e, - 0x3, 0xff, 0xfe, 0xdb, 0x1b, 0x1a, 0x0, 0xfb, 0x12, 0x36, 0x5c, 0x90, - 0xd7, 0x5, 0xff, 0xfe, 0xfb, 0x60, 0x1c, 0x0, 0xfe, 0x4, 0x71, 0x3, - 0xff, 0xfe, 0xd6, 0x24, 0x8, 0x0, 0xfe, 0x40, 0xe3, 0x3, 0xff, 0xfe, - 0x52, 0x2, 0x1e, 0x0, 0xfe, 0x5, 0x6b, 0x3, 0xff, 0xfe, 0xc7, 0x8, - 0x2b, 0x0, 0xfe, 0x1, 0x4e, 0x3, 0xff, 0xfe, 0xdb, 0x1b, 0x1d, 0x0, - 0xfc, 0xd, 0x39, 0x7c, 0xe8, 0x4, 0xff, 0xfe, 0xe3, 0x11, 0x1b, 0x0, - 0xfe, 0x13, 0xe3, 0x2, 0xff, 0xfe, 0xf8, 0x93, 0xa, 0x0, 0xfe, 0xac, - 0xfd, 0x2, 0xff, 0xfe, 0xc9, 0x8, 0x1e, 0x0, 0xfe, 0x5, 0x6b, 0x3, - 0xff, 0xfe, 0xc7, 0x8, 0x2b, 0x0, 0xfe, 0x1, 0x4e, 0x3, 0xff, 0xfe, - 0xdb, 0x1b, 0x1f, 0x0, 0xfd, 0x5, 0x46, 0xdd, 0x4, 0xff, 0xff, 0x60, - 0x1a, 0x0, 0xfe, 0x2, 0x66, 0x3, 0xff, 0xfe, 0xdf, 0x2d, 0xa, 0x0, - 0xfe, 0x4b, 0xe9, 0x3, 0xff, 0xfe, 0x47, 0x1, 0x1d, 0x0, 0xfe, 0x5, - 0x6b, 0x3, 0xff, 0xfe, 0xc7, 0x8, 0x2b, 0x0, 0xfe, 0x1, 0x4e, 0x3, - 0xff, 0xfe, 0xdb, 0x1b, 0x21, 0x0, 0xfe, 0x56, 0xf5, 0x3, 0xff, 0xff, - 0xaa, 0x1a, 0x0, 0xfe, 0xa, 0xdc, 0x2, 0xff, 0xfe, 0xfa, 0xa0, 0xc, - 0x0, 0xfe, 0xb9, 0xfe, 0x2, 0xff, 0xfe, 0xbf, 0x1, 0x1d, 0x0, 0xfe, - 0x5, 0x6b, 0x3, 0xff, 0xfe, 0xc7, 0x8, 0x2b, 0x0, 0xfe, 0x1, 0x4e, - 0x3, 0xff, 0xfe, 0xdb, 0x1b, 0x22, 0x0, 0xfe, 0xd2, 0xfe, 0x2, 0xff, - 0xff, 0xd1, 0x1a, 0x0, 0xff, 0x5b, 0x3, 0xff, 0xfe, 0xe8, 0x35, 0xc, - 0x0, 0xfe, 0x57, 0xef, 0x3, 0xff, 0xff, 0x3c, 0x1d, 0x0, 0xfe, 0x5, - 0x6b, 0x3, 0xff, 0xfe, 0xc7, 0x8, 0x2b, 0x0, 0xfe, 0x1, 0x4e, 0x3, - 0xff, 0xfe, 0xdb, 0x1b, 0x22, 0x0, 0xfe, 0xad, 0xfc, 0x2, 0xff, 0xff, - 0xde, 0x19, 0x0, 0xfe, 0x3, 0xd4, 0x2, 0xff, 0xfe, 0xfc, 0xac, 0xd, - 0x0, 0xfe, 0x1, 0xc6, 0x3, 0xff, 0xff, 0xb5, 0x1d, 0x0, 0xfe, 0x5, - 0x6b, 0x3, 0xff, 0xfe, 0xc7, 0x8, 0x2b, 0x0, 0xfe, 0x1, 0x4e, 0x3, - 0xff, 0xfe, 0xdb, 0x1b, 0xf, 0x0, 0xfd, 0xb, 0x0, 0x1, 0x10, 0x0, - 0xfe, 0xb4, 0xfd, 0x2, 0xff, 0xff, 0xd1, 0x19, 0x0, 0xff, 0x50, 0x3, - 0xff, 0xfe, 0xef, 0x40, 0xe, 0x0, 0xfe, 0x63, 0xf4, 0x2, 0xff, 0xfe, - 0xfc, 0x31, 0x1c, 0x0, 0xfe, 0x5, 0x6b, 0x3, 0xff, 0xfe, 0xc7, 0x8, - 0x2b, 0x0, 0xfe, 0x1, 0x4e, 0x3, 0xff, 0xfe, 0xdb, 0x1b, 0xe, 0x0, - 0xfd, 0x2d, 0xc8, 0x40, 0x11, 0x0, 0xff, 0xdf, 0x3, 0xff, 0xff, 0xaa, - 0x19, 0x0, 0xff, 0xcb, 0x2, 0xff, 0xfe, 0xfd, 0xba, 0xf, 0x0, 0xfe, - 0x3, 0xd3, 0x3, 0xff, 0xff, 0xa9, 0x1c, 0x0, 0xfe, 0x5, 0x6b, 0x3, - 0xff, 0xfe, 0xc7, 0x8, 0x2b, 0x0, 0xfe, 0x1, 0x4e, 0x3, 0xff, 0xfe, - 0xdb, 0x1b, 0xd, 0x0, 0xfb, 0x10, 0xd0, 0xff, 0xda, 0x5e, 0xd, 0x0, - 0xfc, 0x1, 0x0, 0x6c, 0xf6, 0x3, 0xff, 0xff, 0x64, 0x18, 0x0, 0xfe, - 0x46, 0xfe, 0x2, 0xff, 0xfe, 0xf4, 0x4c, 0x10, 0x0, 0xfe, 0x6f, 0xf7, - 0x2, 0xff, 0xfe, 0xf8, 0x27, 0x1b, 0x0, 0xfe, 0x5, 0x6b, 0x3, 0xff, - 0xfe, 0xc7, 0x8, 0x2b, 0x0, 0xfe, 0x1, 0x4e, 0x3, 0xff, 0xfe, 0xdb, - 0x1b, 0xc, 0x0, 0xfe, 0x5, 0xb8, 0x3, 0xff, 0xfd, 0xea, 0x9e, 0x1e, - 0xc, 0x0, 0xfe, 0x49, 0xe1, 0x3, 0xff, 0xfe, 0xf2, 0xf, 0x18, 0x0, - 0xff, 0xc1, 0x2, 0xff, 0xfe, 0xfe, 0xc7, 0x11, 0x0, 0xfe, 0x8, 0xdf, - 0x3, 0xff, 0xff, 0x9d, 0x1b, 0x0, 0xfe, 0x5, 0x6b, 0x3, 0xff, 0xfe, - 0xc7, 0x8, 0x2b, 0x0, 0xfe, 0x1, 0x4e, 0x3, 0xff, 0xfe, 0xdb, 0x1b, - 0xc, 0x0, 0xfe, 0x2, 0x9c, 0x4, 0xff, 0xfc, 0xfa, 0xdb, 0x93, 0x30, - 0x8, 0x0, 0xfd, 0x18, 0x88, 0xe4, 0x4, 0xff, 0xff, 0x6f, 0x18, 0x0, - 0xfe, 0x3b, 0xfa, 0x2, 0xff, 0xfe, 0xf5, 0x4b, 0x12, 0x0, 0xfe, 0x6d, - 0xf9, 0x2, 0xff, 0xfe, 0xf4, 0x1d, 0x1a, 0x0, 0xfe, 0x5, 0x6b, 0x3, - 0xff, 0xff, 0xc5, 0x2c, 0x0, 0xfe, 0x1, 0x4e, 0x3, 0xff, 0xfe, 0xdb, - 0x1b, 0xd, 0x0, 0xfe, 0x12, 0x88, 0x5, 0xff, 0xf4, 0xf8, 0xeb, 0xd2, - 0xa1, 0x7a, 0x64, 0x5f, 0x6b, 0x87, 0xbb, 0xe3, 0xf7, 0x4, 0xff, 0xfe, - 0xa8, 0xa, 0x18, 0x0, 0xff, 0xb6, 0x3, 0xff, 0xfe, 0xfb, 0xb8, 0x11, - 0xb1, 0xfd, 0xb0, 0xc2, 0xfc, 0x2, 0xff, 0xfe, 0xfe, 0x90, 0x1a, 0x0, - 0xfe, 0x5, 0x6b, 0x3, 0xff, 0xfd, 0xe2, 0x7f, 0x79, 0xc, 0x7b, 0xfd, - 0x7c, 0x6b, 0x2, 0x1b, 0x0, 0xfe, 0x1, 0x4e, 0x3, 0xff, 0xfe, 0xdb, - 0x1b, 0xe, 0x0, 0xfd, 0xb, 0x52, 0xe9, 0x6, 0xff, 0xfe, 0xfa, 0xf6, - 0x2, 0xf3, 0xfd, 0xf4, 0xf7, 0xfd, 0x5, 0xff, 0xfe, 0xa1, 0x12, 0x18, - 0x0, 0xfe, 0x31, 0xf5, 0x4, 0xff, 0xff, 0xfb, 0x13, 0xfc, 0x4, 0xff, - 0xfe, 0xed, 0x13, 0x19, 0x0, 0xfe, 0x5, 0x6b, 0x3, 0xff, 0xff, 0xfd, - 0xe, 0xf6, 0xfd, 0xf8, 0xd7, 0x5, 0x1b, 0x0, 0xfe, 0x1, 0x4e, 0x3, - 0xff, 0xfe, 0xdb, 0x1b, 0xf, 0x0, 0xfc, 0x3, 0x1b, 0x81, 0xec, 0xe, - 0xff, 0xfd, 0xe4, 0x5e, 0xd, 0x19, 0x0, 0xfe, 0xa8, 0xfd, 0x1c, 0xff, - 0xfe, 0xfb, 0x84, 0x19, 0x0, 0xfe, 0x5, 0x6b, 0x13, 0xff, 0xfe, 0xe0, - 0x5, 0x1b, 0x0, 0xfe, 0x1, 0x4e, 0x3, 0xff, 0xfe, 0xdb, 0x1b, 0x11, - 0x0, 0xfb, 0x5, 0x15, 0x59, 0xab, 0xeb, 0x8, 0xff, 0xfb, 0xf5, 0xb7, - 0x5c, 0x13, 0x3, 0x19, 0x0, 0xfe, 0x29, 0xf6, 0x1e, 0xff, 0xfe, 0xeb, - 0xd, 0x18, 0x0, 0xfe, 0x5, 0x6d, 0x13, 0xff, 0xfe, 0xe4, 0x5, 0x1b, - 0x0, 0xfe, 0x1, 0x4f, 0x3, 0xff, 0xfe, 0xe0, 0x1b, 0x13, 0x0, 0xf2, - 0x2, 0x5, 0xa, 0x1f, 0x45, 0x5f, 0x6a, 0x69, 0x62, 0x4b, 0x26, 0xc, - 0x6, 0x3, 0x1b, 0x0, 0xfe, 0x36, 0x71, 0x1d, 0x73, 0xfd, 0x74, 0x6f, - 0x26, 0x18, 0x0, 0xfd, 0x2, 0x31, 0x79, 0x11, 0x74, 0xfd, 0x75, 0x65, - 0x2, 0x1b, 0x0, 0xf9, 0x1, 0x23, 0x78, 0x74, 0x76, 0x64, 0xc, 0x17, - 0x0, 0xff, 0x1, 0x4, 0x2, 0xff, 0x1, 0x1f, 0x0, 0xff, 0x1, 0x20, - 0x2, 0xff, 0x1, 0x19, 0x0, 0xff, 0x1, 0x14, 0x2, 0x1d, 0x0, 0xff, - 0x1, 0x4, 0x2, 0x7f, 0x0, 0x3d, 0x0}; -static const Image salt_logo_1_image = {175, 40, 1915, salt_logo_1_data}; - -const VariantAnimation salt_logo = {21, - { - {40, 12, 25, 0, &salt_logo_1_image}, - {40, 12, 25, 5, &salt_logo_1_image}, - {40, 12, 25, 10, &salt_logo_1_image}, - {40, 12, 25, 15, &salt_logo_1_image}, - {40, 12, 25, 20, &salt_logo_1_image}, - {40, 12, 25, 25, &salt_logo_1_image}, - {40, 12, 25, 30, &salt_logo_1_image}, - {40, 12, 25, 35, &salt_logo_1_image}, - {40, 12, 25, 40, &salt_logo_1_image}, - {40, 12, 25, 45, &salt_logo_1_image}, - {40, 12, 25, 50, &salt_logo_1_image}, - {40, 12, 25, 55, &salt_logo_1_image}, - {40, 12, 25, 60, &salt_logo_1_image}, - {40, 12, 25, 65, &salt_logo_1_image}, - {40, 12, 25, 70, &salt_logo_1_image}, - {40, 12, 25, 75, &salt_logo_1_image}, - {40, 12, 25, 80, &salt_logo_1_image}, - {40, 12, 25, 85, &salt_logo_1_image}, - {40, 12, 25, 90, &salt_logo_1_image}, - {40, 12, 25, 95, &salt_logo_1_image}, - {40, 12, 25, 100, &salt_logo_1_image}, - }}; -const VariantAnimation salt_logo_reversed = { - 21, {{40, 12, 25, 100, &salt_logo_1_image}, - {40, 12, 25, 95, &salt_logo_1_image}, - {40, 12, 25, 90, &salt_logo_1_image}, - {40, 12, 25, 85, &salt_logo_1_image}, - {40, 12, 25, 80, &salt_logo_1_image}, - {40, 12, 25, 75, &salt_logo_1_image}, - {40, 12, 25, 70, &salt_logo_1_image}, - {40, 12, 25, 65, &salt_logo_1_image}, - {40, 12, 25, 60, &salt_logo_1_image}, - {40, 12, 25, 55, &salt_logo_1_image}, - {40, 12, 25, 50, &salt_logo_1_image}, - {40, 12, 25, 45, &salt_logo_1_image}, - {40, 12, 25, 40, &salt_logo_1_image}, - {40, 12, 25, 35, &salt_logo_1_image}, - {40, 12, 25, 30, &salt_logo_1_image}, - {40, 12, 25, 25, &salt_logo_1_image}, - {40, 12, 25, 20, &salt_logo_1_image}, - {40, 12, 25, 15, &salt_logo_1_image}, - {40, 12, 25, 10, &salt_logo_1_image}, - {40, 12, 25, 5, &salt_logo_1_image}, - {40, 12, 25, 0, &salt_logo_1_image}}}; - -const VariantAnimation salt_screensaver = { - 82, - { - {40, 10, 150, 60, &salt_logo_1_image}, - {42, 10, 150, 60, &salt_logo_1_image}, - {44, 10, 150, 60, &salt_logo_1_image}, - {46, 10, 150, 60, &salt_logo_1_image}, - {48, 10, 150, 60, &salt_logo_1_image}, - {50, 10, 150, 60, &salt_logo_1_image}, - {52, 10, 150, 60, &salt_logo_1_image}, - {54, 10, 150, 60, &salt_logo_1_image}, - {56, 10, 150, 60, &salt_logo_1_image}, - {58, 10, 150, 60, &salt_logo_1_image}, - {60, 10, 150, 60, &salt_logo_1_image}, - {62, 10, 150, 60, &salt_logo_1_image}, - {64, 10, 150, 60, &salt_logo_1_image}, - {66, 10, 150, 60, &salt_logo_1_image}, - {68, 10, 150, 60, &salt_logo_1_image}, - {70, 10, 150, 60, &salt_logo_1_image}, - {72, 10, 150, 60, &salt_logo_1_image}, - {74, 10, 150, 60, &salt_logo_1_image}, - {76, 10, 150, 60, &salt_logo_1_image}, - {78, 10, 150, 60, &salt_logo_1_image}, - {80, 10, 150, 60, &salt_logo_1_image}, - {80, 10, 150, 60, &salt_logo_1_image}, - {78, 10, 150, 60, &salt_logo_1_image}, - {76, 10, 150, 60, &salt_logo_1_image}, - {74, 10, 150, 60, &salt_logo_1_image}, - {72, 10, 150, 60, &salt_logo_1_image}, - {70, 10, 150, 60, &salt_logo_1_image}, - {68, 10, 150, 60, &salt_logo_1_image}, - {66, 10, 150, 60, &salt_logo_1_image}, - {64, 10, 150, 60, &salt_logo_1_image}, - {62, 10, 150, 60, &salt_logo_1_image}, - {60, 10, 150, 60, &salt_logo_1_image}, - {58, 10, 150, 60, &salt_logo_1_image}, - {56, 10, 150, 60, &salt_logo_1_image}, - {54, 10, 150, 60, &salt_logo_1_image}, - {52, 10, 150, 60, &salt_logo_1_image}, - {50, 10, 150, 60, &salt_logo_1_image}, - {48, 10, 150, 60, &salt_logo_1_image}, - {46, 10, 150, 60, &salt_logo_1_image}, - {44, 10, 150, 60, &salt_logo_1_image}, - {42, 10, 150, 60, &salt_logo_1_image}, - {40, 10, 150, 60, &salt_logo_1_image}, - {38, 10, 150, 60, &salt_logo_1_image}, - {36, 10, 150, 60, &salt_logo_1_image}, - {34, 10, 150, 60, &salt_logo_1_image}, - {32, 10, 150, 60, &salt_logo_1_image}, - {30, 10, 150, 60, &salt_logo_1_image}, - {28, 10, 150, 60, &salt_logo_1_image}, - {26, 10, 150, 60, &salt_logo_1_image}, - {24, 10, 150, 60, &salt_logo_1_image}, - {22, 10, 150, 60, &salt_logo_1_image}, - {20, 10, 150, 60, &salt_logo_1_image}, - {18, 10, 150, 60, &salt_logo_1_image}, - {16, 10, 150, 60, &salt_logo_1_image}, - {14, 10, 150, 60, &salt_logo_1_image}, - {12, 10, 150, 60, &salt_logo_1_image}, - {10, 10, 150, 60, &salt_logo_1_image}, - {8, 10, 150, 60, &salt_logo_1_image}, - {6, 10, 150, 60, &salt_logo_1_image}, - {4, 10, 150, 60, &salt_logo_1_image}, - {2, 10, 150, 60, &salt_logo_1_image}, - {0, 10, 150, 60, &salt_logo_1_image}, - {0, 10, 150, 60, &salt_logo_1_image}, - {2, 10, 150, 60, &salt_logo_1_image}, - {4, 10, 150, 60, &salt_logo_1_image}, - {6, 10, 150, 60, &salt_logo_1_image}, - {8, 10, 150, 60, &salt_logo_1_image}, - {10, 10, 150, 60, &salt_logo_1_image}, - {12, 10, 150, 60, &salt_logo_1_image}, - {14, 10, 150, 60, &salt_logo_1_image}, - {16, 10, 150, 60, &salt_logo_1_image}, - {18, 10, 150, 60, &salt_logo_1_image}, - {20, 10, 150, 60, &salt_logo_1_image}, - {22, 10, 150, 60, &salt_logo_1_image}, - {24, 10, 150, 60, &salt_logo_1_image}, - {26, 10, 150, 60, &salt_logo_1_image}, - {28, 10, 150, 60, &salt_logo_1_image}, - {30, 10, 150, 60, &salt_logo_1_image}, - {32, 10, 150, 60, &salt_logo_1_image}, - {34, 10, 150, 60, &salt_logo_1_image}, - {36, 10, 150, 60, &salt_logo_1_image}, - {38, 10, 150, 60, &salt_logo_1_image}, - }}; diff --git a/lib/variant/salt/salt.c b/lib/variant/salt/salt.c deleted file mode 100644 index e728c9b60..000000000 --- a/lib/variant/salt/salt.c +++ /dev/null @@ -1,6 +0,0 @@ -#include "keepkey/variant/salt.h" - -#include "keepkey/board/timer.h" -#include "keepkey/board/variant.h" - -const VariantInfo variant_salt = {VARIANTINFO_SALT}; diff --git a/scripts/load-variant.sh b/scripts/load-variant.sh index f65ccf2f4..1acc2c9b1 100755 --- a/scripts/load-variant.sh +++ b/scripts/load-variant.sh @@ -1,6 +1,6 @@ #! /bin/bash -BIN_FILE=./bin/variant.fox.bin +BIN_FILE=./bin/variant.keepkey.bin openocd -s /usr/share/openocd/scripts -f interface/jlink.cfg -f ./scripts/openocd/stm32f2x.cfg -c "program $BIN_FILE 0x08010000 verify exit" if [[ $? -ne 0 ]]; then echo $? diff --git a/tools/emulator/CMakeLists.txt b/tools/emulator/CMakeLists.txt index 7b0574e65..c2c674cfc 100644 --- a/tools/emulator/CMakeLists.txt +++ b/tools/emulator/CMakeLists.txt @@ -16,7 +16,6 @@ if(${KK_EMULATOR}) kkboard kkboard.keepkey kkvariant.keepkey - kkvariant.salt kktransport trezorcrypto qrcodegenerator diff --git a/tools/firmware/CMakeLists.txt b/tools/firmware/CMakeLists.txt index 18c50e411..6ee022dd9 100644 --- a/tools/firmware/CMakeLists.txt +++ b/tools/firmware/CMakeLists.txt @@ -32,7 +32,6 @@ if(NOT ${KK_EMULATOR}) kkboard kkboard.keepkey kkvariant.keepkey - kkvariant.salt kktransport trezorcrypto qrcodegenerator diff --git a/tools/rle-dump/CMakeLists.txt b/tools/rle-dump/CMakeLists.txt index 5132118e3..02392fc2e 100644 --- a/tools/rle-dump/CMakeLists.txt +++ b/tools/rle-dump/CMakeLists.txt @@ -13,7 +13,6 @@ if(${KK_EMULATOR}) kkboard kkboard.keepkey kkvariant.keepkey - kkvariant.salt kkboard kktransport trezorcrypto diff --git a/tools/variant/CMakeLists.txt b/tools/variant/CMakeLists.txt index 0a250e92e..e33ec4785 100644 --- a/tools/variant/CMakeLists.txt +++ b/tools/variant/CMakeLists.txt @@ -17,41 +17,4 @@ if(NOT ${KK_EMULATOR}) ${CMAKE_BINARY_DIR}/bin/variant.keepkey.elf ${CMAKE_BINARY_DIR}/bin/variant.keepkey.bin) - add_executable(variant.salt.elf salt.c header.s) - target_link_libraries(variant.salt.elf - -Wl,--whole-archive kkvariant.salt -Wl,--no-whole-archive) - add_custom_command(TARGET variant.salt.elf - POST_BUILD - COMMAND ${CMAKE_OBJCOPY} ARGS -O binary - ${CMAKE_BINARY_DIR}/bin/variant.salt.elf - ${CMAKE_BINARY_DIR}/bin/variant.salt.bin) - - add_executable(variant.fox.elf fox.c header.s) - add_custom_command(TARGET variant.fox.elf - POST_BUILD - COMMAND ${CMAKE_OBJCOPY} ARGS -O binary - ${CMAKE_BINARY_DIR}/bin/variant.fox.elf - ${CMAKE_BINARY_DIR}/bin/variant.fox.bin) - - add_executable(variant.kaspersky.elf kaspersky.c header.s) - add_custom_command(TARGET variant.kaspersky.elf - POST_BUILD - COMMAND ${CMAKE_OBJCOPY} ARGS -O binary - ${CMAKE_BINARY_DIR}/bin/variant.kaspersky.elf - ${CMAKE_BINARY_DIR}/bin/variant.kaspersky.bin) - - add_executable(variant.blockpit.elf blockpit.c header.s) - add_custom_command(TARGET variant.blockpit.elf - POST_BUILD - COMMAND ${CMAKE_OBJCOPY} ARGS -O binary - ${CMAKE_BINARY_DIR}/bin/variant.blockpit.elf - ${CMAKE_BINARY_DIR}/bin/variant.blockpit.bin) - - add_executable(variant.dash.elf dash.c header.s) - add_custom_command(TARGET variant.dash.elf - POST_BUILD - COMMAND ${CMAKE_OBJCOPY} ARGS -O binary - ${CMAKE_BINARY_DIR}/bin/variant.dash.elf - ${CMAKE_BINARY_DIR}/bin/variant.dash.bin) - endif() diff --git a/tools/variant/blockpit.c b/tools/variant/blockpit.c deleted file mode 100644 index 0888d58f3..000000000 --- a/tools/variant/blockpit.c +++ /dev/null @@ -1,1144 +0,0 @@ -/* - * This file is part of the KeepKey project. - * - * Copyright (C) 2018 KeepKey LLC - * - * This library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see . - */ - -#include "keepkey/board/variant.h" - -#include "keepkey/board/timer.h" - -const uint8_t blockpit_logo_data[5567] = { - 0x7f, 0x0, 0x7f, 0x0, 0x1d, 0x0, 0xfa, 0x19, 0x94, 0xe2, 0xd0, 0x5e, - 0x2, 0x7f, 0x0, 0x79, 0x0, 0xf7, 0x8, 0x6f, 0xdb, 0xe4, 0xe5, 0xe6, - 0xe7, 0xbb, 0x34, 0x7f, 0x0, 0x77, 0x0, 0xf4, 0x49, 0xc5, 0xe2, 0xe3, - 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x95, 0x17, 0x7f, 0x0, 0x73, 0x0, - 0xf0, 0x28, 0xa7, 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, - 0xe9, 0xea, 0xdf, 0x6b, 0x5, 0x7f, 0x0, 0x6f, 0x0, 0xed, 0x10, 0x81, - 0xda, 0xde, 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, - 0xea, 0xeb, 0xec, 0xc8, 0x40, 0x7f, 0x0, 0x6c, 0x0, 0xe9, 0x3, 0x5c, - 0xcc, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, - 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xa3, 0x1e, 0x7f, 0x0, 0x69, - 0x0, 0xe6, 0x39, 0xb4, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe2, - 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, - 0xef, 0xe8, 0x78, 0x9, 0x7f, 0x0, 0x65, 0x0, 0xe3, 0x1c, 0x94, 0xd8, - 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe5, - 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, - 0xd4, 0x4d, 0x7f, 0x0, 0x62, 0x0, 0xdf, 0x9, 0x70, 0xd0, 0xd7, 0xd8, - 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe5, - 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, - 0xf2, 0xf3, 0xb2, 0x26, 0x7f, 0x0, 0x5e, 0x0, 0xdb, 0x1, 0x4c, 0xbe, - 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, - 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, - 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf1, 0x86, 0xe, 0x7f, 0x0, - 0x5b, 0x0, 0xd8, 0x2b, 0xa3, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, - 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, - 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, - 0xf3, 0xf4, 0xf5, 0xf6, 0xe0, 0x5a, 0x1, 0x7f, 0x0, 0x57, 0x0, 0xd5, - 0x13, 0x81, 0xd0, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, - 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, - 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, - 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xc1, 0x30, 0x7f, 0x0, 0x54, 0x0, 0xd1, - 0x5, 0x5f, 0xc4, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, - 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe5, - 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, - 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xfa, 0xf9, 0x96, 0x13, 0x18, - 0x0, 0xff, 0x1, 0x1e, 0x0, 0xff, 0x1, 0x42, 0x0, 0xff, 0x1, 0x45, - 0x0, 0xff, 0x1, 0xf, 0x0, 0xcf, 0x1e, 0xaf, 0xce, 0xcf, 0xd0, 0xd1, - 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, - 0xde, 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, - 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, - 0xf7, 0xf8, 0xfa, 0xfb, 0xfc, 0xec, 0x69, 0x15, 0x0, 0xfd, 0x1, 0x57, - 0xc6, 0x1c, 0x0, 0xfd, 0x20, 0xa0, 0x5c, 0x40, 0x0, 0xfd, 0x31, 0xb5, - 0x30, 0x43, 0x0, 0xfd, 0x1, 0x54, 0xc6, 0xf, 0x0, 0xce, 0x3b, 0xcd, - 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, - 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, - 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, - 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xa, - 0x13, 0x0, 0xfc, 0x4f, 0xcf, 0xff, 0xf0, 0x1a, 0x0, 0xfb, 0x1a, 0x98, - 0xfa, 0xff, 0x60, 0x3e, 0x0, 0xfe, 0x2a, 0xad, 0x2, 0xff, 0xff, 0x30, - 0x32, 0x0, 0xfa, 0x6b, 0xdc, 0xf9, 0xf2, 0xc9, 0x34, 0xa, 0x0, 0xfc, - 0x4d, 0xcf, 0xff, 0xf0, 0x10, 0x0, 0xd0, 0x30, 0xa7, 0xcf, 0xd0, 0xd1, - 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, - 0xde, 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, - 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, - 0xf7, 0xf8, 0xfa, 0xfb, 0xfc, 0xd6, 0x49, 0x12, 0x0, 0xfe, 0x46, 0xc8, - 0x3, 0xff, 0xff, 0xf0, 0x18, 0x0, 0xfd, 0x16, 0x90, 0xf7, 0x3, 0xff, - 0xff, 0x60, 0x3c, 0x0, 0xfd, 0x23, 0xa3, 0xfe, 0x3, 0xff, 0xff, 0x30, - 0x31, 0x0, 0xfe, 0x1d, 0xfe, 0x4, 0xff, 0xff, 0xbf, 0x8, 0x0, 0xfe, - 0x46, 0xc8, 0x3, 0xff, 0xff, 0xf0, 0x11, 0x0, 0xd2, 0x2, 0x55, 0xc2, - 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, - 0xdd, 0xde, 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, - 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, - 0xf6, 0xf7, 0xf8, 0xfa, 0xed, 0x71, 0x5, 0x13, 0x0, 0xff, 0xf0, 0x4, - 0xff, 0xff, 0xf0, 0x18, 0x0, 0xff, 0x80, 0x5, 0xff, 0xff, 0x60, 0x3c, - 0x0, 0xff, 0xa0, 0x5, 0xff, 0xff, 0x30, 0x31, 0x0, 0xff, 0x3e, 0x5, - 0xff, 0xff, 0xe0, 0x8, 0x0, 0xff, 0xf0, 0x4, 0xff, 0xff, 0xf0, 0x13, - 0x0, 0xda, 0xf, 0x7d, 0xd1, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, - 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe2, 0xd9, 0x6e, 0x20, 0x3c, - 0xb6, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, - 0xf3, 0xf4, 0xf5, 0xf6, 0x2, 0xf7, 0xfe, 0x98, 0x16, 0x15, 0x0, 0xff, - 0xf0, 0x4, 0xff, 0xff, 0xf0, 0x18, 0x0, 0xff, 0x80, 0x5, 0xff, 0xff, - 0x60, 0x3c, 0x0, 0xff, 0xa0, 0x5, 0xff, 0xff, 0x30, 0x31, 0x0, 0xff, - 0x3d, 0x5, 0xff, 0xff, 0xdf, 0x8, 0x0, 0xff, 0xf0, 0x4, 0xff, 0xff, - 0xf0, 0x15, 0x0, 0xef, 0x28, 0xa3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, - 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0x90, 0x18, 0x3, 0x0, 0xee, - 0x2, 0x59, 0xd6, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, - 0xf3, 0xf4, 0xf5, 0xf6, 0xbe, 0x31, 0x17, 0x0, 0xff, 0xf0, 0x4, 0xff, - 0xff, 0xf0, 0x18, 0x0, 0xff, 0x80, 0x5, 0xff, 0xff, 0x60, 0x3c, 0x0, - 0xff, 0xa0, 0x5, 0xff, 0xff, 0x30, 0x31, 0x0, 0xfe, 0x17, 0xfc, 0x4, - 0xff, 0xff, 0xb5, 0x8, 0x0, 0xff, 0xf0, 0x4, 0xff, 0xff, 0xf0, 0xc, - 0x0, 0xfd, 0xc7, 0x96, 0x22, 0x7, 0x0, 0xf2, 0x1, 0x4d, 0xc1, 0xd6, - 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xb1, 0x31, 0x7, 0x0, - 0xf1, 0xe, 0x85, 0xe8, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, - 0xf4, 0xdb, 0x56, 0x1, 0x7, 0x0, 0xfd, 0x3a, 0xc9, 0x61, 0xe, 0x0, - 0xff, 0xf0, 0x4, 0xff, 0xff, 0xf0, 0x18, 0x0, 0xff, 0x80, 0x5, 0xff, - 0xff, 0x60, 0x3c, 0x0, 0xff, 0xa0, 0x5, 0xff, 0xff, 0x30, 0x32, 0x0, - 0xfa, 0x56, 0xbb, 0xd8, 0xcc, 0xa5, 0x22, 0x8, 0x0, 0xff, 0xf0, 0x4, - 0xff, 0xff, 0xf0, 0xc, 0x0, 0xfb, 0xcc, 0xce, 0xcd, 0x76, 0xc, 0x7, - 0x0, 0xf5, 0xc, 0x75, 0xd4, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xc9, 0x54, - 0x2, 0xa, 0x0, 0xf5, 0x29, 0xb1, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, - 0xeb, 0x7d, 0xa, 0x7, 0x0, 0xfb, 0x1b, 0xa2, 0xfa, 0xfc, 0x6d, 0xe, - 0x0, 0xff, 0xf0, 0x4, 0xff, 0xff, 0xf0, 0x18, 0x0, 0xff, 0x80, 0x5, - 0xff, 0xff, 0x60, 0x3c, 0x0, 0xff, 0xa0, 0x5, 0xff, 0xff, 0x30, 0x40, - 0x0, 0xff, 0xf0, 0x4, 0xff, 0xff, 0xf0, 0xc, 0x0, 0xf9, 0xcc, 0xce, - 0xd0, 0xd2, 0xc3, 0x53, 0x2, 0x7, 0x0, 0xf9, 0x22, 0x9d, 0xd9, 0xda, - 0xd7, 0x76, 0xb, 0xe, 0x0, 0xf9, 0x51, 0xd4, 0xef, 0xf0, 0xf1, 0xa3, - 0x1e, 0x7, 0x0, 0xf9, 0x9, 0x77, 0xeb, 0xf8, 0xfa, 0xfc, 0x6d, 0xe, - 0x0, 0xff, 0xf0, 0x4, 0xff, 0xff, 0xf0, 0x18, 0x0, 0xff, 0x80, 0x5, - 0xff, 0xff, 0x60, 0x3c, 0x0, 0xff, 0xa0, 0x5, 0xff, 0xff, 0x30, 0x40, - 0x0, 0xff, 0xf0, 0x4, 0xff, 0xff, 0xf0, 0xc, 0x0, 0xf8, 0xcc, 0xce, - 0xd0, 0xd2, 0xd4, 0xd6, 0xac, 0x31, 0x8, 0x0, 0xfd, 0x1a, 0x29, 0xe, - 0x11, 0x0, 0xfc, 0x5, 0x33, 0x40, 0x1b, 0x8, 0x0, 0xf8, 0x4f, 0xd4, - 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, 0x6d, 0xe, 0x0, 0xff, 0xf0, 0x4, 0xff, - 0xff, 0xf0, 0x4, 0x0, 0xf9, 0xd, 0x4c, 0x75, 0x80, 0x73, 0x52, 0x19, - 0xd, 0x0, 0xff, 0x80, 0x5, 0xff, 0xff, 0x60, 0xd, 0x0, 0xf8, 0xb, - 0x3c, 0x69, 0x7a, 0x80, 0x72, 0x52, 0x20, 0x15, 0x0, 0xf7, 0x5, 0x34, - 0x63, 0x76, 0x80, 0x78, 0x69, 0x45, 0x15, 0x9, 0x0, 0xff, 0xa0, 0x5, - 0xff, 0xff, 0x30, 0x1e, 0x0, 0xf9, 0x6, 0x41, 0x6e, 0x80, 0x75, 0x5b, - 0x25, 0x1b, 0x0, 0xff, 0xf0, 0x4, 0xff, 0xff, 0xf0, 0xc, 0x0, 0xf6, - 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0x8b, 0x16, 0x24, 0x0, - 0xf6, 0x2a, 0xb2, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, 0x6d, 0xe, - 0x0, 0xff, 0xf0, 0x4, 0xff, 0xff, 0xf0, 0x2, 0x0, 0xfd, 0x1f, 0x9d, - 0xf9, 0x6, 0xff, 0xfe, 0xc2, 0x52, 0xb, 0x0, 0xff, 0x80, 0x5, 0xff, - 0xff, 0x60, 0xb, 0x0, 0xfd, 0x40, 0xad, 0xf7, 0x7, 0xff, 0xfd, 0xd3, - 0x75, 0xc, 0x10, 0x0, 0xfd, 0x2a, 0x9c, 0xee, 0x8, 0xff, 0xfd, 0xd0, - 0x6c, 0x8, 0x6, 0x0, 0xff, 0xa0, 0x5, 0xff, 0xff, 0x30, 0x9, 0x0, - 0xfb, 0x33, 0xcc, 0xff, 0xd2, 0x30, 0x6, 0x0, 0xfa, 0x1, 0x81, 0xf1, - 0xfd, 0xb7, 0x17, 0x2, 0x0, 0xfd, 0x10, 0x87, 0xef, 0x6, 0xff, 0xfd, - 0xd4, 0x6a, 0x4, 0xa, 0x0, 0xfb, 0x19, 0xb9, 0xfe, 0xf0, 0x7e, 0x5, - 0x0, 0xfe, 0x2f, 0x7f, 0x2, 0x90, 0xff, 0xf9, 0x4, 0xff, 0xff, 0xf9, - 0x3, 0x90, 0xfe, 0x86, 0x44, 0x7, 0x0, 0xf4, 0xcc, 0xce, 0xd0, 0xd2, - 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xd4, 0x68, 0x5, 0x20, 0x0, 0xf4, 0x11, - 0x8a, 0xe9, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, 0x6d, 0xe, - 0x0, 0xff, 0xf0, 0x4, 0xff, 0xfc, 0xf0, 0x0, 0x6c, 0xf7, 0xa, 0xff, - 0xfe, 0xbe, 0x1a, 0x9, 0x0, 0xff, 0x80, 0x5, 0xff, 0xff, 0x60, 0x9, - 0x0, 0xfe, 0x20, 0xbb, 0xc, 0xff, 0xfe, 0xec, 0x60, 0xd, 0x0, 0xfd, - 0xa, 0x93, 0xfe, 0xc, 0xff, 0xfe, 0xda, 0x2d, 0x5, 0x0, 0xff, 0xa0, - 0x5, 0xff, 0xff, 0x30, 0x8, 0x0, 0xfe, 0x3a, 0xf1, 0x3, 0xff, 0xfe, - 0xe7, 0xf, 0x5, 0x0, 0xff, 0x62, 0x4, 0xff, 0xfc, 0xba, 0x0, 0x4a, - 0xe9, 0xa, 0xff, 0xfe, 0xd8, 0x30, 0x9, 0x0, 0xff, 0xbd, 0x4, 0xff, - 0xff, 0x5d, 0x3, 0x0, 0xfe, 0x48, 0xfb, 0xe, 0xff, 0xff, 0x73, 0x6, - 0x0, 0xf3, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, - 0xe0, 0xc1, 0x42, 0x1d, 0x0, 0xf2, 0x4, 0x63, 0xd9, 0xe9, 0xeb, 0xed, - 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, 0x6d, 0xe, 0x0, 0xff, 0xf0, - 0x4, 0xff, 0xfe, 0xf0, 0x8e, 0xd, 0xff, 0xfe, 0xea, 0x2d, 0x8, 0x0, - 0xff, 0x80, 0x5, 0xff, 0xff, 0x60, 0x8, 0x0, 0xfe, 0x47, 0xf2, 0xf, - 0xff, 0xfe, 0xa7, 0x6, 0xa, 0x0, 0xfe, 0x1c, 0xd3, 0xf, 0xff, 0xfe, - 0xe7, 0xc, 0x4, 0x0, 0xff, 0xa0, 0x5, 0xff, 0xff, 0x30, 0x7, 0x0, - 0xfe, 0x42, 0xf6, 0x5, 0xff, 0xff, 0x52, 0x5, 0x0, 0xff, 0xb3, 0x5, - 0xff, 0xfe, 0x6e, 0xfd, 0xc, 0xff, 0xfe, 0xf8, 0x4e, 0x7, 0x0, 0xff, - 0xf, 0x5, 0xff, 0xff, 0xad, 0x3, 0x0, 0xff, 0xbc, 0xf, 0xff, 0xff, - 0xef, 0x6, 0x0, 0xf1, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, - 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0x9e, 0x6, 0x1a, 0x0, 0xf1, 0x22, 0xbe, - 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, - 0x66, 0xe, 0x0, 0xff, 0xf0, 0x14, 0xff, 0xfe, 0xeb, 0x21, 0x7, 0x0, - 0xff, 0x80, 0x5, 0xff, 0xff, 0x60, 0x7, 0x0, 0xfe, 0x4e, 0xfa, 0x11, - 0xff, 0xfe, 0xb9, 0x5, 0x8, 0x0, 0xfe, 0x15, 0xdc, 0x11, 0xff, 0xff, - 0x5b, 0x4, 0x0, 0xff, 0xa0, 0x5, 0xff, 0xff, 0x30, 0x6, 0x0, 0xfe, - 0x42, 0xf6, 0x6, 0xff, 0xff, 0x36, 0x5, 0x0, 0xff, 0xc0, 0x14, 0xff, - 0xfe, 0xfa, 0x40, 0x6, 0x0, 0xff, 0x20, 0x5, 0xff, 0xff, 0xc0, 0x3, - 0x0, 0xff, 0xc9, 0xf, 0xff, 0xff, 0xfd, 0x6, 0x0, 0xf1, 0xcc, 0xce, - 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, - 0x66, 0x1a, 0x0, 0xf1, 0xa9, 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, - 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, 0x64, 0xe, 0x0, 0xff, 0xf0, 0xb, - 0xff, 0xfe, 0xf3, 0xfd, 0x8, 0xff, 0xfe, 0xcc, 0x4, 0x6, 0x0, 0xff, - 0x80, 0x5, 0xff, 0xff, 0x60, 0x6, 0x0, 0xfe, 0x2c, 0xf4, 0x8, 0xff, - 0xfd, 0xf6, 0xf0, 0xfe, 0x8, 0xff, 0xff, 0x96, 0x7, 0x0, 0xfe, 0x2, - 0xbe, 0x9, 0xff, 0xfe, 0xf9, 0xf8, 0x7, 0xff, 0xff, 0x6d, 0x4, 0x0, - 0xff, 0xa0, 0x5, 0xff, 0xff, 0x30, 0x5, 0x0, 0xfe, 0x42, 0xf6, 0x6, - 0xff, 0xff, 0x9f, 0x6, 0x0, 0xff, 0xc0, 0xb, 0xff, 0xfe, 0xf6, 0xfa, - 0x8, 0xff, 0xfe, 0xe8, 0x16, 0x5, 0x0, 0xff, 0x20, 0x5, 0xff, 0xff, - 0xc0, 0x3, 0x0, 0xff, 0x7a, 0xf, 0xff, 0xff, 0xb3, 0x6, 0x0, 0xf1, - 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, - 0xe5, 0xe7, 0x90, 0x1a, 0x0, 0xf1, 0xd2, 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, - 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, 0x64, 0xe, 0x0, 0xff, - 0xf0, 0x8, 0xff, 0xf8, 0xb6, 0x4d, 0xb, 0x0, 0x2, 0x2d, 0x84, 0xf3, - 0x6, 0xff, 0xff, 0x6e, 0x6, 0x0, 0xff, 0x80, 0x5, 0xff, 0xff, 0x60, - 0x5, 0x0, 0xfe, 0x3, 0xcb, 0x6, 0xff, 0xfd, 0xed, 0x7c, 0x24, 0x2, - 0x0, 0xfd, 0xd, 0x4d, 0xbc, 0x7, 0xff, 0xff, 0x46, 0x6, 0x0, 0xff, - 0x65, 0x7, 0xff, 0xfd, 0xb7, 0x56, 0x15, 0x2, 0x0, 0xfd, 0x1b, 0x59, - 0xd4, 0x4, 0xff, 0xff, 0x33, 0x4, 0x0, 0xff, 0xa0, 0x5, 0xff, 0xff, - 0x30, 0x4, 0x0, 0xfe, 0x4e, 0xf9, 0x6, 0xff, 0xfe, 0xa0, 0x3, 0x6, - 0x0, 0xff, 0xc0, 0x8, 0xff, 0xfd, 0xcd, 0x5d, 0x13, 0x2, 0x0, 0xfd, - 0x21, 0x71, 0xe6, 0x6, 0xff, 0xff, 0x9a, 0x5, 0x0, 0xff, 0x20, 0x5, - 0xff, 0xff, 0xc0, 0x3, 0x0, 0xfd, 0x3, 0x82, 0xd9, 0x2, 0xe0, 0xff, - 0xfe, 0x4, 0xff, 0xff, 0xfe, 0x3, 0xe0, 0xfd, 0xde, 0xa1, 0x12, 0x6, - 0x0, 0xf1, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, - 0xe0, 0xe2, 0xe5, 0xe7, 0x92, 0x1a, 0x0, 0xf1, 0xd4, 0xe3, 0xe5, 0xe7, - 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, 0x64, 0xe, - 0x0, 0xff, 0xf0, 0x6, 0xff, 0xfe, 0xfd, 0x65, 0x7, 0x0, 0xfe, 0x23, - 0xdc, 0x5, 0xff, 0xfe, 0xea, 0x7, 0x5, 0x0, 0xff, 0x80, 0x5, 0xff, - 0xff, 0x60, 0x5, 0x0, 0xff, 0x5f, 0x6, 0xff, 0xfe, 0xc0, 0x16, 0x7, - 0x0, 0xfe, 0x66, 0xfd, 0x5, 0xff, 0xfe, 0xd6, 0x1, 0x4, 0x0, 0xfe, - 0x6, 0xe6, 0x5, 0xff, 0xfe, 0xf6, 0x53, 0x7, 0x0, 0xfb, 0x7, 0x7f, - 0xe5, 0xe9, 0x79, 0x5, 0x0, 0xff, 0xa0, 0x5, 0xff, 0xff, 0x30, 0x3, - 0x0, 0xfe, 0x4e, 0xfa, 0x6, 0xff, 0xfe, 0x90, 0x1, 0x7, 0x0, 0xff, - 0xc0, 0x7, 0xff, 0xfe, 0x8e, 0x3, 0x6, 0x0, 0xfe, 0x11, 0xbe, 0x5, - 0xff, 0xfe, 0xfe, 0x21, 0x4, 0x0, 0xff, 0x20, 0x5, 0xff, 0xff, 0xc0, - 0x8, 0x0, 0xff, 0xf0, 0x4, 0xff, 0xff, 0xf0, 0xc, 0x0, 0xf1, 0xcc, - 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, - 0xe7, 0x92, 0x1a, 0x0, 0xf1, 0xd4, 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, - 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, 0x64, 0xe, 0x0, 0xff, 0xf0, - 0x6, 0xff, 0xff, 0x74, 0x9, 0x0, 0xfe, 0x20, 0xf1, 0x5, 0xff, 0xff, - 0x5c, 0x5, 0x0, 0xff, 0x80, 0x5, 0xff, 0xff, 0x60, 0x5, 0x0, 0xff, - 0xd5, 0x5, 0xff, 0xfe, 0xcd, 0xa, 0x9, 0x0, 0xff, 0x60, 0x6, 0xff, - 0xff, 0x4c, 0x4, 0x0, 0xff, 0x5c, 0x6, 0xff, 0xff, 0x4b, 0x12, 0x0, - 0xff, 0xa0, 0x5, 0xff, 0xff, 0x30, 0x2, 0x0, 0xfe, 0x4e, 0xfa, 0x6, - 0xff, 0xff, 0x7f, 0x9, 0x0, 0xff, 0xc0, 0x6, 0xff, 0xff, 0xa3, 0x9, - 0x0, 0xfe, 0xa, 0xd8, 0x5, 0xff, 0xff, 0x8a, 0x4, 0x0, 0xff, 0x20, - 0x5, 0xff, 0xff, 0xc0, 0x8, 0x0, 0xff, 0xf0, 0x4, 0xff, 0xff, 0xf0, - 0xc, 0x0, 0xf1, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, - 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0x92, 0x1a, 0x0, 0xf1, 0xd4, 0xe3, 0xe5, - 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, 0x64, - 0xe, 0x0, 0xff, 0xf0, 0x5, 0xff, 0xfe, 0xc7, 0x2, 0xa, 0x0, 0xff, - 0x68, 0x5, 0xff, 0xff, 0xae, 0x5, 0x0, 0xff, 0x80, 0x5, 0xff, 0xff, - 0x60, 0x4, 0x0, 0xff, 0x2f, 0x5, 0xff, 0xfe, 0xfc, 0x2a, 0xb, 0x0, - 0xff, 0xaf, 0x5, 0xff, 0xff, 0xa7, 0x4, 0x0, 0xff, 0xb0, 0x5, 0xff, - 0xff, 0x9e, 0x13, 0x0, 0xff, 0xa0, 0x5, 0xff, 0xfc, 0x30, 0x0, 0x5a, - 0xfa, 0x6, 0xff, 0xff, 0x6e, 0xa, 0x0, 0xff, 0xc0, 0x5, 0xff, 0xfe, - 0xea, 0xe, 0xa, 0x0, 0xff, 0x38, 0x5, 0xff, 0xff, 0xda, 0x4, 0x0, - 0xff, 0x20, 0x5, 0xff, 0xff, 0xc0, 0x8, 0x0, 0xff, 0xf0, 0x4, 0xff, - 0xff, 0xf0, 0xc, 0x0, 0xf1, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, - 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0x92, 0x1a, 0x0, 0xf1, 0xd4, - 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, - 0xfc, 0x64, 0xe, 0x0, 0xff, 0xf0, 0x5, 0xff, 0xff, 0x50, 0xb, 0x0, - 0xfe, 0x7, 0xe9, 0x4, 0xff, 0xff, 0xef, 0x5, 0x0, 0xff, 0x80, 0x5, - 0xff, 0xff, 0x60, 0x4, 0x0, 0xff, 0x79, 0x5, 0xff, 0xff, 0xa6, 0xc, - 0x0, 0xff, 0x2f, 0x5, 0xff, 0xff, 0xef, 0x3, 0x0, 0xfe, 0x1, 0xf2, - 0x5, 0xff, 0xff, 0x27, 0x13, 0x0, 0xff, 0xa0, 0x5, 0xff, 0xfd, 0x30, - 0x5b, 0xfd, 0x5, 0xff, 0xfe, 0xfd, 0x5e, 0xb, 0x0, 0xff, 0xc0, 0x5, - 0xff, 0xff, 0x80, 0xc, 0x0, 0xff, 0xc2, 0x5, 0xff, 0xff, 0x1c, 0x3, - 0x0, 0xff, 0x20, 0x5, 0xff, 0xff, 0xc0, 0x8, 0x0, 0xff, 0xf0, 0x4, - 0xff, 0xff, 0xf0, 0xc, 0x0, 0xf1, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, - 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0x92, 0x1a, 0x0, 0xf1, - 0xd4, 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, - 0xfa, 0xfc, 0x64, 0xe, 0x0, 0xff, 0xf0, 0x4, 0xff, 0xfe, 0xf8, 0x8, - 0xc, 0x0, 0xff, 0xa1, 0x5, 0xff, 0xff, 0x1b, 0x4, 0x0, 0xff, 0x80, - 0x5, 0xff, 0xff, 0x60, 0x4, 0x0, 0xff, 0xa9, 0x5, 0xff, 0xff, 0x4f, - 0xd, 0x0, 0xff, 0xd7, 0x5, 0xff, 0xff, 0x20, 0x2, 0x0, 0xff, 0x20, - 0x5, 0xff, 0xff, 0xd6, 0x14, 0x0, 0xff, 0xa0, 0x5, 0xff, 0xfe, 0x8b, - 0xfd, 0x5, 0xff, 0xfe, 0xf9, 0x4f, 0xc, 0x0, 0xff, 0xc0, 0x5, 0xff, - 0xff, 0x30, 0xc, 0x0, 0xff, 0x73, 0x5, 0xff, 0xff, 0x48, 0x3, 0x0, - 0xff, 0x20, 0x5, 0xff, 0xff, 0xc0, 0x8, 0x0, 0xff, 0xf0, 0x4, 0xff, - 0xff, 0xf0, 0xc, 0x0, 0xf1, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, - 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0x92, 0x1a, 0x0, 0xf1, 0xd4, - 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, - 0xfc, 0x64, 0xe, 0x0, 0xff, 0xf0, 0x4, 0xff, 0xff, 0xca, 0xd, 0x0, - 0xff, 0x6c, 0x5, 0xff, 0xff, 0x39, 0x4, 0x0, 0xff, 0x80, 0x5, 0xff, - 0xff, 0x60, 0x4, 0x0, 0xff, 0xcc, 0x5, 0xff, 0xff, 0x18, 0xd, 0x0, - 0xff, 0xa0, 0x5, 0xff, 0xff, 0x43, 0x2, 0x0, 0xff, 0x3f, 0x5, 0xff, - 0xff, 0xa0, 0x14, 0x0, 0xff, 0xa0, 0xc, 0xff, 0xff, 0x48, 0xd, 0x0, - 0xff, 0xc0, 0x4, 0xff, 0xfe, 0xf7, 0x2, 0xc, 0x0, 0xff, 0x3d, 0x5, - 0xff, 0xff, 0x65, 0x3, 0x0, 0xff, 0x20, 0x5, 0xff, 0xff, 0xc0, 0x8, - 0x0, 0xff, 0xf0, 0x4, 0xff, 0xff, 0xf0, 0xc, 0x0, 0xf1, 0xcc, 0xce, - 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, - 0x92, 0x1a, 0x0, 0xf1, 0xd4, 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, - 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, 0x64, 0xe, 0x0, 0xff, 0xf0, 0x4, - 0xff, 0xff, 0xb5, 0xd, 0x0, 0xff, 0x57, 0x5, 0xff, 0xff, 0x46, 0x4, - 0x0, 0xff, 0x80, 0x5, 0xff, 0xff, 0x60, 0x4, 0x0, 0xff, 0xdb, 0x4, - 0xff, 0xff, 0xfd, 0xe, 0x0, 0xff, 0x84, 0x5, 0xff, 0xff, 0x52, 0x2, - 0x0, 0xff, 0x4e, 0x5, 0xff, 0xff, 0x8a, 0x14, 0x0, 0xff, 0xa0, 0xc, - 0xff, 0xfe, 0xab, 0x3, 0xc, 0x0, 0xff, 0xc0, 0x4, 0xff, 0xff, 0xe4, - 0xd, 0x0, 0xff, 0x28, 0x5, 0xff, 0xff, 0x72, 0x3, 0x0, 0xff, 0x20, - 0x5, 0xff, 0xff, 0xc0, 0x8, 0x0, 0xff, 0xf0, 0x4, 0xff, 0xff, 0xf0, - 0xc, 0x0, 0xf1, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, - 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0x92, 0x1a, 0x0, 0xf1, 0xd4, 0xe3, 0xe5, - 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, 0x64, - 0xe, 0x0, 0xff, 0xf0, 0x4, 0xff, 0xff, 0xb4, 0xd, 0x0, 0xff, 0x56, - 0x5, 0xff, 0xff, 0x47, 0x4, 0x0, 0xff, 0x80, 0x5, 0xff, 0xff, 0x60, - 0x4, 0x0, 0xff, 0xdd, 0x4, 0xff, 0xff, 0xfb, 0xe, 0x0, 0xff, 0x81, - 0x5, 0xff, 0xff, 0x54, 0x2, 0x0, 0xff, 0x50, 0x5, 0xff, 0xff, 0x87, - 0x14, 0x0, 0xff, 0xa0, 0xd, 0xff, 0xff, 0x95, 0xc, 0x0, 0xff, 0xc0, - 0x4, 0xff, 0xff, 0xe3, 0xd, 0x0, 0xff, 0x27, 0x5, 0xff, 0xff, 0x73, - 0x3, 0x0, 0xff, 0x20, 0x5, 0xff, 0xff, 0xc0, 0x8, 0x0, 0xff, 0xf0, - 0x4, 0xff, 0xff, 0xf0, 0xc, 0x0, 0xf1, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, - 0xd6, 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0x92, 0x1a, 0x0, - 0xf1, 0xd4, 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, - 0xf8, 0xfa, 0xfc, 0x64, 0xe, 0x0, 0xff, 0xf0, 0x4, 0xff, 0xff, 0xc8, - 0xd, 0x0, 0xff, 0x6a, 0x5, 0xff, 0xff, 0x3b, 0x4, 0x0, 0xff, 0x80, - 0x5, 0xff, 0xff, 0x60, 0x4, 0x0, 0xff, 0xcf, 0x5, 0xff, 0xff, 0x10, - 0xd, 0x0, 0xff, 0x9a, 0x5, 0xff, 0xff, 0x46, 0x2, 0x0, 0xff, 0x40, - 0x5, 0xff, 0xff, 0x9c, 0x14, 0x0, 0xff, 0xa0, 0xe, 0xff, 0xff, 0x7f, - 0xb, 0x0, 0xff, 0xc0, 0x4, 0xff, 0xfe, 0xf6, 0x1, 0xc, 0x0, 0xff, - 0x3b, 0x5, 0xff, 0xff, 0x67, 0x3, 0x0, 0xff, 0x20, 0x5, 0xff, 0xff, - 0xc0, 0x8, 0x0, 0xff, 0xf0, 0x4, 0xff, 0xff, 0xf0, 0xc, 0x0, 0xf1, - 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, - 0xe5, 0xe7, 0xa2, 0x19, 0x0, 0xf0, 0x15, 0xe1, 0xe3, 0xe5, 0xe7, 0xe9, - 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, 0x64, 0xe, 0x0, - 0xff, 0xf0, 0x4, 0xff, 0xfe, 0xf6, 0x6, 0xc, 0x0, 0xff, 0x9e, 0x5, - 0xff, 0xff, 0x1f, 0x4, 0x0, 0xff, 0x80, 0x5, 0xff, 0xff, 0x60, 0x4, - 0x0, 0xff, 0xb0, 0x5, 0xff, 0xff, 0x44, 0xd, 0x0, 0xff, 0xcc, 0x5, - 0xff, 0xff, 0x27, 0x2, 0x0, 0xff, 0x25, 0x5, 0xff, 0xff, 0xd0, 0x14, - 0x0, 0xff, 0xa0, 0x7, 0xff, 0xff, 0xfc, 0x7, 0xff, 0xff, 0x65, 0xa, - 0x0, 0xff, 0xc0, 0x5, 0xff, 0xff, 0x2b, 0xc, 0x0, 0xff, 0x70, 0x5, - 0xff, 0xff, 0x4b, 0x3, 0x0, 0xff, 0x20, 0x5, 0xff, 0xff, 0xc0, 0x8, - 0x0, 0xff, 0xf0, 0x4, 0xff, 0xff, 0xf0, 0xc, 0x0, 0xf0, 0xcc, 0xce, - 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, - 0xe5, 0x3b, 0x17, 0x0, 0xef, 0xc, 0x9c, 0xe1, 0xe3, 0xe5, 0xe7, 0xe9, - 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, 0x64, 0xe, 0x0, - 0xff, 0xf0, 0x5, 0xff, 0xff, 0x49, 0xb, 0x0, 0xfe, 0x6, 0xe6, 0x4, - 0xff, 0xfe, 0xf4, 0x1, 0x4, 0x0, 0xff, 0x80, 0x5, 0xff, 0xff, 0x60, - 0x4, 0x0, 0xff, 0x80, 0x5, 0xff, 0xff, 0x99, 0xc, 0x0, 0xff, 0x21, - 0x5, 0xff, 0xfe, 0xf7, 0x3, 0x2, 0x0, 0xfe, 0x3, 0xf7, 0x4, 0xff, - 0xfe, 0xfe, 0x22, 0x13, 0x0, 0xff, 0xa0, 0x6, 0xff, 0xfd, 0xc9, 0x26, - 0xd3, 0x6, 0xff, 0xfe, 0xfd, 0x52, 0x9, 0x0, 0xff, 0xc0, 0x5, 0xff, - 0xff, 0x78, 0xc, 0x0, 0xff, 0xbd, 0x5, 0xff, 0xff, 0x22, 0x3, 0x0, - 0xff, 0x20, 0x5, 0xff, 0xff, 0xc0, 0x8, 0x0, 0xff, 0xf0, 0x4, 0xff, - 0xff, 0xf0, 0xc, 0x0, 0xf2, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, - 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0x2, 0xe9, 0xfe, 0x8d, 0x13, - 0x13, 0x0, 0xed, 0x2, 0x53, 0xc9, 0xdf, 0xe1, 0xe3, 0xe5, 0xe7, 0xe9, - 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, 0x63, 0xe, 0x0, - 0xff, 0xf0, 0x5, 0xff, 0xff, 0xbe, 0xb, 0x0, 0xff, 0x60, 0x5, 0xff, - 0xff, 0xb4, 0x5, 0x0, 0xff, 0x80, 0x5, 0xff, 0xff, 0x60, 0x4, 0x0, - 0xff, 0x3c, 0x5, 0xff, 0xfe, 0xf7, 0x1d, 0xb, 0x0, 0xff, 0x9d, 0x5, - 0xff, 0xff, 0xb3, 0x4, 0x0, 0xff, 0xba, 0x5, 0xff, 0xff, 0x9a, 0x13, - 0x0, 0xff, 0xa0, 0x5, 0xff, 0xfb, 0xbd, 0xc, 0x0, 0x1b, 0xdc, 0x6, - 0xff, 0xfe, 0xf8, 0x3f, 0x8, 0x0, 0xff, 0xc0, 0x5, 0xff, 0xfe, 0xe4, - 0xa, 0xa, 0x0, 0xff, 0x32, 0x5, 0xff, 0xff, 0xe2, 0x4, 0x0, 0xff, - 0x20, 0x5, 0xff, 0xff, 0xc0, 0x8, 0x0, 0xff, 0xf0, 0x4, 0xff, 0xff, - 0xf0, 0xc, 0x0, 0xec, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, - 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xe0, 0x66, 0x4, - 0x10, 0x0, 0xec, 0x31, 0xad, 0xdb, 0xdd, 0xdf, 0xe1, 0xe3, 0xe5, 0xe7, - 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, 0x5a, 0xe, - 0x0, 0xff, 0xf0, 0x6, 0xff, 0xff, 0x65, 0x9, 0x0, 0xfe, 0x19, 0xed, - 0x5, 0xff, 0xff, 0x69, 0x5, 0x0, 0xff, 0x80, 0x5, 0xff, 0xff, 0x60, - 0x4, 0x0, 0xfe, 0x2, 0xe4, 0x5, 0xff, 0xfe, 0xbd, 0x3, 0x9, 0x0, - 0xfe, 0x4a, 0xfe, 0x5, 0xff, 0xff, 0x5d, 0x4, 0x0, 0xff, 0x6b, 0x6, - 0xff, 0xff, 0x48, 0x12, 0x0, 0xff, 0xa0, 0x5, 0xff, 0xff, 0x30, 0x3, - 0x0, 0xfe, 0x24, 0xe5, 0x6, 0xff, 0xfe, 0xf1, 0x2f, 0x7, 0x0, 0xff, - 0xc0, 0x6, 0xff, 0xff, 0x94, 0x9, 0x0, 0xfe, 0x7, 0xd0, 0x5, 0xff, - 0xff, 0x94, 0x4, 0x0, 0xff, 0x20, 0x5, 0xff, 0xff, 0xc0, 0x8, 0x0, - 0xff, 0xf0, 0x4, 0xff, 0xff, 0xf0, 0xc, 0x0, 0xeb, 0xcc, 0xce, 0xd0, - 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0xe9, - 0xeb, 0xed, 0xef, 0xf1, 0xc9, 0x3e, 0xd, 0x0, 0xea, 0x16, 0x8a, 0xd7, - 0xd9, 0xdb, 0xdd, 0xdf, 0xe1, 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, - 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, 0x5a, 0xe, 0x0, 0xff, 0xf0, 0x6, - 0xff, 0xfe, 0xfa, 0x4e, 0x7, 0x0, 0xfe, 0x18, 0xd3, 0x5, 0xff, 0xfe, - 0xf3, 0xd, 0x5, 0x0, 0xff, 0x80, 0x5, 0xff, 0xff, 0x60, 0x5, 0x0, - 0xff, 0x72, 0x6, 0xff, 0xfe, 0xab, 0xc, 0x7, 0x0, 0xfe, 0x4a, 0xf6, - 0x5, 0xff, 0xfe, 0xe2, 0x6, 0x4, 0x0, 0xfe, 0xe, 0xf4, 0x5, 0xff, - 0xfe, 0xf1, 0x43, 0x8, 0x0, 0xfc, 0x28, 0x92, 0x9c, 0x4a, 0x5, 0x0, - 0xff, 0xa0, 0x5, 0xff, 0xff, 0x30, 0x4, 0x0, 0xfe, 0x2d, 0xec, 0x6, - 0xff, 0xfe, 0xe7, 0x22, 0x6, 0x0, 0xff, 0xc0, 0x7, 0xff, 0xff, 0x75, - 0x7, 0x0, 0xfe, 0x9, 0xb2, 0x6, 0xff, 0xff, 0x2d, 0x4, 0x0, 0xff, - 0x20, 0x5, 0xff, 0xff, 0xc0, 0x8, 0x0, 0xff, 0xe7, 0x4, 0xff, 0xfe, - 0xfa, 0x3, 0xb, 0x0, 0xe9, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, - 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, - 0xf3, 0xf5, 0xa6, 0x1e, 0x9, 0x0, 0xe8, 0x7, 0x66, 0xcb, 0xd5, 0xd7, - 0xd9, 0xdb, 0xdd, 0xdf, 0xe1, 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, - 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, 0x5a, 0xe, 0x0, 0xff, 0xf0, 0x8, - 0xff, 0xfe, 0x9a, 0x30, 0x3, 0x0, 0xfd, 0x14, 0x6b, 0xea, 0x6, 0xff, - 0xff, 0x82, 0x6, 0x0, 0xff, 0x80, 0x5, 0xff, 0xff, 0x60, 0x5, 0x0, - 0xfe, 0xa, 0xde, 0x6, 0xff, 0xfd, 0xde, 0x61, 0xd, 0x3, 0x0, 0xfe, - 0x33, 0xa1, 0x7, 0xff, 0xff, 0x5f, 0x6, 0x0, 0xff, 0x83, 0x6, 0xff, - 0xfd, 0xfe, 0x9f, 0x32, 0x4, 0x0, 0xfd, 0x1a, 0x84, 0xfa, 0x3, 0xff, - 0xff, 0x50, 0x4, 0x0, 0xff, 0xa0, 0x5, 0xff, 0xff, 0x30, 0x5, 0x0, - 0xfe, 0x37, 0xf3, 0x6, 0xff, 0xfe, 0xdc, 0x15, 0x5, 0x0, 0xff, 0xc0, - 0x8, 0xff, 0xfd, 0xb5, 0x3f, 0x3, 0x2, 0x0, 0xfd, 0xc, 0x59, 0xd8, - 0x6, 0xff, 0xff, 0xb0, 0x5, 0x0, 0xff, 0x20, 0x5, 0xff, 0xff, 0xc0, - 0x8, 0x0, 0xff, 0xd6, 0x5, 0xff, 0xfa, 0x82, 0xf, 0x21, 0x5c, 0x4f, - 0x1, 0x6, 0x0, 0xe7, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, - 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, - 0xf5, 0xf7, 0xf1, 0x7e, 0x6, 0x6, 0x0, 0xe7, 0x3f, 0xb5, 0xd1, 0xd3, - 0xd5, 0xd7, 0xd9, 0xdb, 0xdd, 0xdf, 0xe1, 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, - 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, 0x5a, 0xe, 0x0, 0xff, - 0xf0, 0xa, 0xff, 0xfc, 0xed, 0xd4, 0xe2, 0xfd, 0x7, 0xff, 0xfe, 0xdf, - 0xb, 0x6, 0x0, 0xff, 0x80, 0x5, 0xff, 0xff, 0x60, 0x6, 0x0, 0xfe, - 0x40, 0xfd, 0x7, 0xff, 0xfc, 0xfd, 0xdd, 0xd4, 0xef, 0x8, 0xff, 0xff, - 0xb4, 0x7, 0x0, 0xfe, 0xb, 0xde, 0x8, 0xff, 0xfc, 0xef, 0xd6, 0xd9, - 0xec, 0x6, 0xff, 0xff, 0xb1, 0x4, 0x0, 0xff, 0xa0, 0x5, 0xff, 0xff, - 0x30, 0x6, 0x0, 0xfe, 0x42, 0xf9, 0x6, 0xff, 0xff, 0xbf, 0x5, 0x0, - 0xff, 0xc0, 0xa, 0xff, 0xfc, 0xf3, 0xd7, 0xdc, 0xfa, 0x7, 0xff, 0xfe, - 0xf4, 0x22, 0x5, 0x0, 0xff, 0x20, 0x5, 0xff, 0xff, 0xc0, 0x8, 0x0, - 0xff, 0xbb, 0xa, 0xff, 0xff, 0x74, 0x6, 0x0, 0xe7, 0xcc, 0xce, 0xd0, - 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0xe9, - 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf7, 0xf9, 0xfb, 0x9d, 0x5, 0x0, - 0xe6, 0x12, 0xcd, 0xcf, 0xd1, 0xd3, 0xd5, 0xd7, 0xd9, 0xdb, 0xdd, 0xdf, - 0xe1, 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, - 0xfa, 0xfc, 0x5a, 0xe, 0x0, 0xff, 0xf0, 0x14, 0xff, 0xfe, 0xfa, 0x36, - 0x7, 0x0, 0xff, 0x80, 0x5, 0xff, 0xff, 0x60, 0x7, 0x0, 0xff, 0x6b, - 0x12, 0xff, 0xfe, 0xd2, 0xf, 0x8, 0x0, 0xfe, 0x31, 0xf6, 0x11, 0xff, - 0xff, 0xb4, 0x4, 0x0, 0xff, 0xa0, 0x5, 0xff, 0xff, 0x30, 0x7, 0x0, - 0xfe, 0x4f, 0xfd, 0x6, 0xff, 0xff, 0x2e, 0x4, 0x0, 0xff, 0xc0, 0x15, - 0xff, 0xff, 0x5a, 0x6, 0x0, 0xff, 0x20, 0x5, 0xff, 0xff, 0xc0, 0x8, - 0x0, 0xff, 0x7b, 0xa, 0xff, 0xff, 0xc5, 0x6, 0x0, 0xe7, 0xcc, 0xce, - 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, - 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf7, 0xf9, 0xfb, 0xf6, 0x5, - 0x0, 0xe6, 0x2b, 0xcd, 0xcf, 0xd1, 0xd3, 0xd5, 0xd7, 0xd9, 0xdb, 0xdd, - 0xdf, 0xe1, 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, - 0xf8, 0xfa, 0xfc, 0x58, 0xe, 0x0, 0xff, 0xed, 0x4, 0xff, 0xfe, 0xf3, - 0xdc, 0xd, 0xff, 0xfe, 0xfa, 0x4e, 0x8, 0x0, 0xff, 0x70, 0x5, 0xff, - 0xff, 0x55, 0x8, 0x0, 0xfe, 0x69, 0xfd, 0xf, 0xff, 0xfe, 0xc5, 0x14, - 0xa, 0x0, 0xfe, 0x42, 0xf1, 0xf, 0xff, 0xfe, 0xfd, 0x48, 0x4, 0x0, - 0xff, 0x9b, 0x5, 0xff, 0xff, 0x29, 0x8, 0x0, 0xff, 0x5e, 0x6, 0xff, - 0xff, 0x3c, 0x4, 0x0, 0xff, 0xc0, 0x5, 0xff, 0xff, 0xcc, 0xe, 0xff, - 0xff, 0x69, 0x7, 0x0, 0xff, 0x13, 0x5, 0xff, 0xff, 0xb1, 0x8, 0x0, - 0xfe, 0x1e, 0xf6, 0x9, 0xff, 0xff, 0xc1, 0x6, 0x0, 0xe7, 0xa3, 0xce, - 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, - 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf7, 0xf9, 0xfb, 0xfd, 0x5, - 0x0, 0xe6, 0x2d, 0xcd, 0xcf, 0xd1, 0xd3, 0xd5, 0xd7, 0xd9, 0xdb, 0xdd, - 0xdf, 0xe1, 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, - 0xf8, 0xfa, 0xfc, 0x34, 0xe, 0x0, 0xff, 0xcd, 0x4, 0xff, 0xfd, 0xca, - 0x14, 0xb2, 0xb, 0xff, 0xfe, 0xdf, 0x36, 0x9, 0x0, 0xfe, 0x2e, 0xfd, - 0x3, 0xff, 0xfe, 0xf5, 0x17, 0x9, 0x0, 0xfe, 0x38, 0xd7, 0xc, 0xff, - 0xfd, 0xfa, 0x82, 0x7, 0xc, 0x0, 0xfe, 0x27, 0xcd, 0xd, 0xff, 0xfe, - 0xea, 0x4e, 0x5, 0x0, 0xff, 0x54, 0x4, 0xff, 0xfe, 0xe1, 0x3, 0x9, - 0x0, 0xff, 0x6e, 0x4, 0xff, 0xfe, 0xe4, 0x9, 0x4, 0x0, 0xff, 0xc0, - 0x5, 0xff, 0xfd, 0x17, 0x91, 0xfe, 0xa, 0xff, 0xfe, 0xef, 0x51, 0x9, - 0x0, 0xff, 0xcc, 0x4, 0xff, 0xff, 0x6c, 0x9, 0x0, 0xfe, 0x52, 0xf3, - 0x7, 0xff, 0xfe, 0xf9, 0x43, 0x6, 0x0, 0xe7, 0x1c, 0xa1, 0xd0, 0xd2, - 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0xe9, 0xeb, - 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf7, 0xf9, 0xfb, 0xfd, 0x5, 0x0, 0xe7, - 0x2d, 0xcd, 0xcf, 0xd1, 0xd3, 0xd5, 0xd7, 0xd9, 0xdb, 0xdd, 0xdf, 0xe1, - 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xed, - 0x6f, 0xf, 0x0, 0xfe, 0x55, 0xfe, 0x2, 0xff, 0xfe, 0xfd, 0x4d, 0x2, - 0x0, 0xfe, 0x4a, 0xc6, 0x7, 0xff, 0xfd, 0xe7, 0x7a, 0x9, 0xb, 0x0, - 0xfb, 0x66, 0xf4, 0xff, 0xe9, 0x4b, 0xb, 0x0, 0xfd, 0x4, 0x60, 0xcd, - 0x8, 0xff, 0xfd, 0xee, 0x95, 0x1e, 0xf, 0x0, 0xfd, 0x2, 0x60, 0xd0, - 0x9, 0xff, 0xfd, 0xcb, 0x6e, 0xc, 0x7, 0x0, 0xfb, 0x8b, 0xfc, 0xff, - 0xe0, 0x35, 0xb, 0x0, 0xfb, 0x6d, 0xf3, 0xff, 0xce, 0x2a, 0x5, 0x0, - 0xff, 0xc0, 0x5, 0xff, 0xfb, 0x10, 0x0, 0x35, 0xb4, 0xfe, 0x6, 0xff, - 0xfd, 0xf1, 0x90, 0x14, 0xa, 0x0, 0xfa, 0x26, 0xd5, 0xff, 0xfe, 0x9a, - 0x3, 0xa, 0x0, 0xfc, 0x16, 0x82, 0xd2, 0xfc, 0x2, 0xff, 0xfd, 0xf9, - 0xb1, 0x2e, 0x8, 0x0, 0xe8, 0x1, 0x4c, 0xbd, 0xd4, 0xd6, 0xd8, 0xda, - 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, - 0xf5, 0xf7, 0xf9, 0xfb, 0xfd, 0x5, 0x0, 0xe8, 0x2d, 0xcd, 0xcf, 0xd1, - 0xd3, 0xd5, 0xd7, 0xd9, 0xdb, 0xdd, 0xdf, 0xe1, 0xe3, 0xe5, 0xe7, 0xe9, - 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf4, 0x99, 0x17, 0x11, 0x0, 0xfc, 0x3c, - 0x95, 0x94, 0x3b, 0x5, 0x0, 0xf8, 0x26, 0x69, 0x8f, 0xa0, 0x93, 0x75, - 0x3f, 0x3, 0xe, 0x0, 0xfd, 0x8, 0x1f, 0x3, 0xf, 0x0, 0xf7, 0x21, - 0x59, 0x84, 0x96, 0x9d, 0x8e, 0x6f, 0x3d, 0x5, 0x14, 0x0, 0xf7, 0x25, - 0x5e, 0x8a, 0x99, 0x9c, 0x8c, 0x79, 0x4b, 0x18, 0xb, 0x0, 0xfd, 0xf, - 0x1f, 0x2, 0xd, 0x0, 0xfe, 0x6, 0x11, 0x7, 0x0, 0xff, 0xc0, 0x5, - 0xff, 0xff, 0x10, 0x3, 0x0, 0xf8, 0x1a, 0x5e, 0x8a, 0x9e, 0x95, 0x7d, - 0x49, 0x9, 0xe, 0x0, 0xfe, 0x1c, 0x10, 0xf, 0x0, 0xfc, 0x7, 0x1a, - 0x1f, 0x5, 0xc, 0x0, 0xea, 0xb, 0x72, 0xd2, 0xd8, 0xda, 0xdc, 0xde, - 0xe0, 0xe2, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf7, - 0xf9, 0xfb, 0xfd, 0x5, 0x0, 0xea, 0x2d, 0xcd, 0xcf, 0xd1, 0xd3, 0xd5, - 0xd7, 0xd9, 0xdb, 0xdd, 0xdf, 0xe1, 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, - 0xef, 0xf1, 0xbd, 0x32, 0x7f, 0x0, 0xf, 0x0, 0xff, 0xc0, 0x5, 0xff, - 0xff, 0x10, 0x3c, 0x0, 0xec, 0x1f, 0x99, 0xda, 0xdc, 0xde, 0xe0, 0xe2, - 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf7, 0xf9, 0xfb, - 0xfd, 0x5, 0x0, 0xeb, 0x2d, 0xcd, 0xcf, 0xd1, 0xd3, 0xd5, 0xd7, 0xd9, - 0xdb, 0xdd, 0xdf, 0xe1, 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xd7, 0x55, - 0x1, 0x7f, 0x0, 0x10, 0x0, 0xff, 0xc0, 0x5, 0xff, 0xff, 0x10, 0x3e, - 0x0, 0xee, 0x3f, 0xbc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, - 0xef, 0xf1, 0xf3, 0xf5, 0xf7, 0xf9, 0xfb, 0xfd, 0x5, 0x0, 0xed, 0x2d, - 0xcd, 0xcf, 0xd1, 0xd3, 0xd5, 0xd7, 0xd9, 0xdb, 0xdd, 0xdf, 0xe1, 0xe3, - 0xe5, 0xe7, 0xe9, 0xe4, 0x7b, 0xa, 0x7f, 0x0, 0x12, 0x0, 0xff, 0xc0, - 0x5, 0xff, 0xff, 0x10, 0x3f, 0x0, 0xef, 0x5, 0x68, 0xd5, 0xe2, 0xe5, - 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf7, 0xf9, 0xfb, 0xfd, - 0x5, 0x0, 0xef, 0x2d, 0xcd, 0xcf, 0xd1, 0xd3, 0xd5, 0xd7, 0xd9, 0xdb, - 0xdd, 0xdf, 0xe1, 0xe3, 0xe5, 0xe7, 0x9d, 0x1e, 0x7f, 0x0, 0x14, 0x0, - 0xff, 0xc0, 0x5, 0xff, 0xff, 0x10, 0x41, 0x0, 0xf1, 0x16, 0x90, 0xe5, - 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf7, 0xf9, 0xfb, 0xfd, - 0x5, 0x0, 0xf1, 0x2d, 0xcd, 0xcf, 0xd1, 0xd3, 0xd5, 0xd7, 0xd9, 0xdb, - 0xdd, 0xdf, 0xe1, 0xe3, 0xbd, 0x3b, 0x7f, 0x0, 0x16, 0x0, 0xff, 0xc0, - 0x5, 0xff, 0xff, 0x10, 0x43, 0x0, 0xf3, 0x33, 0xb8, 0xe9, 0xeb, 0xed, - 0xef, 0xf1, 0xf3, 0xf5, 0xf7, 0xf9, 0xfb, 0xfd, 0x5, 0x0, 0xf2, 0x2d, - 0xcd, 0xcf, 0xd1, 0xd3, 0xd5, 0xd7, 0xd9, 0xdb, 0xdd, 0xdf, 0xd1, 0x5d, - 0x4, 0x7f, 0x0, 0x17, 0x0, 0xff, 0xc0, 0x5, 0xff, 0xff, 0x10, 0x44, - 0x0, 0xf4, 0x2, 0x5b, 0xd8, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf7, 0xf9, - 0xfb, 0xfd, 0x5, 0x0, 0xf4, 0x2d, 0xcd, 0xcf, 0xd1, 0xd3, 0xd5, 0xd7, - 0xd9, 0xdb, 0xda, 0x81, 0x10, 0x7f, 0x0, 0x19, 0x0, 0xff, 0xae, 0x4, - 0xff, 0xfe, 0xfd, 0x9, 0x46, 0x0, 0xf6, 0xe, 0x85, 0xec, 0xf1, 0xf3, - 0xf5, 0xf7, 0xf9, 0xfb, 0xfd, 0x5, 0x0, 0xf6, 0x2d, 0xcd, 0xcf, 0xd1, - 0xd3, 0xd5, 0xd7, 0xd9, 0xa1, 0x25, 0x7f, 0x0, 0x1b, 0x0, 0xff, 0x53, - 0x4, 0xff, 0xff, 0xa7, 0x49, 0x0, 0xf8, 0x27, 0xb0, 0xf3, 0xf5, 0xf7, - 0xf9, 0xfb, 0xfd, 0x5, 0x0, 0xf8, 0x31, 0xcd, 0xcf, 0xd1, 0xd3, 0xd5, - 0xbb, 0x44, 0x7f, 0x0, 0x1e, 0x0, 0xfb, 0x63, 0xd2, 0xdd, 0x95, 0xb, - 0x4b, 0x0, 0xfa, 0x4d, 0xd6, 0xf7, 0xf9, 0xfb, 0xfd, 0x5, 0x0, 0xf9, - 0x32, 0xcd, 0xcf, 0xd1, 0xc9, 0x65, 0x6, 0x7f, 0x0, 0x70, 0x0, 0xfb, - 0x8, 0x78, 0xf0, 0xfb, 0xfd, 0x5, 0x0, 0xfb, 0x32, 0xcd, 0xcf, 0x85, - 0x16, 0x7f, 0x0, 0x74, 0x0, 0xfd, 0x1c, 0xa5, 0xe7, 0x5, 0x0, 0xfd, - 0x26, 0x9d, 0x2d, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x60, 0x0}; -static const Image blockpit_logo_image = {256, 64, 5567, blockpit_logo_data}; - -const VariantAnimation blockpit_logo = { - 21, - { - {0, 0, 25, 0, &blockpit_logo_image}, - {0, 0, 25, 5, &blockpit_logo_image}, - {0, 0, 25, 10, &blockpit_logo_image}, - {0, 0, 25, 15, &blockpit_logo_image}, - {0, 0, 25, 20, &blockpit_logo_image}, - {0, 0, 25, 25, &blockpit_logo_image}, - {0, 0, 25, 30, &blockpit_logo_image}, - {0, 0, 25, 35, &blockpit_logo_image}, - {0, 0, 25, 40, &blockpit_logo_image}, - {0, 0, 25, 45, &blockpit_logo_image}, - {0, 0, 25, 50, &blockpit_logo_image}, - {0, 0, 25, 55, &blockpit_logo_image}, - {0, 0, 25, 60, &blockpit_logo_image}, - {0, 0, 25, 65, &blockpit_logo_image}, - {0, 0, 25, 70, &blockpit_logo_image}, - {0, 0, 25, 75, &blockpit_logo_image}, - {0, 0, 25, 80, &blockpit_logo_image}, - {0, 0, 25, 85, &blockpit_logo_image}, - {0, 0, 25, 90, &blockpit_logo_image}, - {0, 0, 25, 95, &blockpit_logo_image}, - {0, 0, 25, 100, &blockpit_logo_image}, - }}; -const VariantAnimation blockpit_logo_reversed = { - 21, - { - {0, 0, 25, 100, &blockpit_logo_image}, - {0, 0, 25, 95, &blockpit_logo_image}, - {0, 0, 25, 90, &blockpit_logo_image}, - {0, 0, 25, 85, &blockpit_logo_image}, - {0, 0, 25, 80, &blockpit_logo_image}, - {0, 0, 25, 75, &blockpit_logo_image}, - {0, 0, 25, 70, &blockpit_logo_image}, - {0, 0, 25, 65, &blockpit_logo_image}, - {0, 0, 25, 60, &blockpit_logo_image}, - {0, 0, 25, 55, &blockpit_logo_image}, - {0, 0, 25, 50, &blockpit_logo_image}, - {0, 0, 25, 45, &blockpit_logo_image}, - {0, 0, 25, 40, &blockpit_logo_image}, - {0, 0, 25, 35, &blockpit_logo_image}, - {0, 0, 25, 30, &blockpit_logo_image}, - {0, 0, 25, 25, &blockpit_logo_image}, - {0, 0, 25, 20, &blockpit_logo_image}, - {0, 0, 25, 15, &blockpit_logo_image}, - {0, 0, 25, 10, &blockpit_logo_image}, - {0, 0, 25, 5, &blockpit_logo_image}, - {0, 0, 25, 0, &blockpit_logo_image}, - }}; - -const uint8_t blockpit_screensaver_data[2339] = { - 0x57, 0x0, 0xfa, 0x19, 0x94, 0xe2, 0xd0, 0x5e, 0x2, 0x34, 0x0, 0xf7, - 0x8, 0x6f, 0xdb, 0xe4, 0xe5, 0xe6, 0xe7, 0xbb, 0x34, 0x32, 0x0, 0xf4, - 0x49, 0xc5, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0x95, 0x17, - 0x2e, 0x0, 0xf0, 0x28, 0xa7, 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, - 0xe7, 0xe8, 0xe9, 0xea, 0xdf, 0x6b, 0x5, 0x2a, 0x0, 0xed, 0x10, 0x81, - 0xda, 0xde, 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, - 0xea, 0xeb, 0xec, 0xc8, 0x40, 0x27, 0x0, 0xe9, 0x3, 0x5c, 0xcc, 0xdc, - 0xdd, 0xde, 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, - 0xea, 0xeb, 0xec, 0xed, 0xee, 0xa3, 0x1e, 0x24, 0x0, 0xe6, 0x39, 0xb4, - 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, - 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xe8, 0x78, 0x9, - 0x20, 0x0, 0xe3, 0x1c, 0x94, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, - 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, - 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xd4, 0x4d, 0x1d, 0x0, 0xdf, 0x9, - 0x70, 0xd0, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, - 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, - 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xb2, 0x26, 0x19, 0x0, 0xdb, 0x1, - 0x4c, 0xbe, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, - 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, - 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf1, 0x86, 0xe, - 0x16, 0x0, 0xd8, 0x2b, 0xa3, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, - 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, - 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, - 0xf3, 0xf4, 0xf5, 0xf6, 0xe0, 0x5a, 0x1, 0x12, 0x0, 0xd5, 0x13, 0x81, - 0xd0, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, - 0xdd, 0xde, 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, - 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, - 0xf6, 0xf7, 0xf8, 0xc1, 0x30, 0xf, 0x0, 0xd1, 0x5, 0x5f, 0xc4, 0xd0, - 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, - 0xdd, 0xde, 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, - 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, - 0xf6, 0xf7, 0xf8, 0xfa, 0xf9, 0x96, 0x13, 0xc, 0x0, 0xcf, 0x1e, 0xaf, - 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, - 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, - 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, - 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xfa, 0xfb, 0xfc, 0xec, 0x69, 0xb, - 0x0, 0xce, 0x3b, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, - 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe2, - 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, - 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xfa, 0xfb, - 0xfc, 0xfd, 0xfe, 0xa, 0xb, 0x0, 0xd0, 0x30, 0xa7, 0xcf, 0xd0, 0xd1, - 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, - 0xde, 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, - 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, - 0xf7, 0xf8, 0xfa, 0xfb, 0xfc, 0xd6, 0x49, 0xd, 0x0, 0xd2, 0x2, 0x55, - 0xc2, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, - 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, - 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, - 0xf5, 0xf6, 0xf7, 0xf8, 0xfa, 0xed, 0x71, 0x5, 0x10, 0x0, 0xda, 0xf, - 0x7d, 0xd1, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, - 0xdd, 0xde, 0xdf, 0xe0, 0xe2, 0xd9, 0x6e, 0x20, 0x3c, 0xb6, 0xe8, 0xe9, - 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, - 0xf6, 0x2, 0xf7, 0xfe, 0x98, 0x16, 0x14, 0x0, 0xef, 0x28, 0xa3, 0xd4, - 0xd5, 0xd6, 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, - 0x90, 0x18, 0x3, 0x0, 0xee, 0x2, 0x59, 0xd6, 0xea, 0xeb, 0xec, 0xed, - 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xbe, 0x31, 0xd, - 0x0, 0xfd, 0xc7, 0x96, 0x22, 0x7, 0x0, 0xf2, 0x1, 0x4d, 0xc1, 0xd6, - 0xd7, 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xb1, 0x31, 0x7, 0x0, - 0xf1, 0xe, 0x85, 0xe8, 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, - 0xf4, 0xdb, 0x56, 0x1, 0x7, 0x0, 0xfd, 0x3a, 0xc9, 0x61, 0x4, 0x0, - 0xfb, 0xcc, 0xce, 0xcd, 0x76, 0xc, 0x7, 0x0, 0xf5, 0xc, 0x75, 0xd4, - 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xc9, 0x54, 0x2, 0xa, 0x0, 0xf5, 0x29, - 0xb1, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xeb, 0x7d, 0xa, 0x7, 0x0, - 0xfb, 0x1b, 0xa2, 0xfa, 0xfc, 0x6d, 0x4, 0x0, 0xf9, 0xcc, 0xce, 0xd0, - 0xd2, 0xc3, 0x53, 0x2, 0x7, 0x0, 0xf9, 0x22, 0x9d, 0xd9, 0xda, 0xd7, - 0x76, 0xb, 0xe, 0x0, 0xf9, 0x51, 0xd4, 0xef, 0xf0, 0xf1, 0xa3, 0x1e, - 0x7, 0x0, 0xf9, 0x9, 0x77, 0xeb, 0xf8, 0xfa, 0xfc, 0x6d, 0x4, 0x0, - 0xf8, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xac, 0x31, 0x8, 0x0, 0xfd, - 0x1a, 0x29, 0xe, 0x11, 0x0, 0xfc, 0x5, 0x33, 0x40, 0x1b, 0x8, 0x0, - 0xf8, 0x4f, 0xd4, 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, 0x6d, 0x4, 0x0, 0xf6, - 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0x8b, 0x16, 0x24, 0x0, - 0xf6, 0x2a, 0xb2, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, 0x6d, 0x4, - 0x0, 0xf4, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xd4, - 0x68, 0x5, 0x20, 0x0, 0xf4, 0x11, 0x8a, 0xe9, 0xed, 0xef, 0xf1, 0xf3, - 0xf5, 0xf8, 0xfa, 0xfc, 0x6d, 0x4, 0x0, 0xf3, 0xcc, 0xce, 0xd0, 0xd2, - 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xc1, 0x42, 0x1d, 0x0, 0xf2, - 0x4, 0x63, 0xd9, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, - 0xfc, 0x6d, 0x4, 0x0, 0xf1, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, - 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0x9e, 0x6, 0x1a, 0x0, 0xf1, 0x22, - 0xbe, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, - 0xfc, 0x66, 0x4, 0x0, 0xf1, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, - 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0x66, 0x1a, 0x0, 0xf1, 0xa9, - 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, - 0xfc, 0x64, 0x4, 0x0, 0xf1, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, - 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0x90, 0x1a, 0x0, 0xf1, 0xd2, - 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, - 0xfc, 0x64, 0x4, 0x0, 0xf1, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, - 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0x92, 0x1a, 0x0, 0xf1, 0xd4, - 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, - 0xfc, 0x64, 0x4, 0x0, 0xf1, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, - 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0x92, 0x1a, 0x0, 0xf1, 0xd4, - 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, - 0xfc, 0x64, 0x4, 0x0, 0xf1, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, - 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0x92, 0x1a, 0x0, 0xf1, 0xd4, - 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, - 0xfc, 0x64, 0x4, 0x0, 0xf1, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, - 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0x92, 0x1a, 0x0, 0xf1, 0xd4, - 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, - 0xfc, 0x64, 0x4, 0x0, 0xf1, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, - 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0x92, 0x1a, 0x0, 0xf1, 0xd4, - 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, - 0xfc, 0x64, 0x4, 0x0, 0xf1, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, - 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0x92, 0x1a, 0x0, 0xf1, 0xd4, - 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, - 0xfc, 0x64, 0x4, 0x0, 0xf1, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, - 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0x92, 0x1a, 0x0, 0xf1, 0xd4, - 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, - 0xfc, 0x64, 0x4, 0x0, 0xf1, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, - 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0x92, 0x1a, 0x0, 0xf1, 0xd4, - 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, - 0xfc, 0x64, 0x4, 0x0, 0xf1, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, - 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0x92, 0x1a, 0x0, 0xf1, 0xd4, - 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, - 0xfc, 0x64, 0x4, 0x0, 0xf1, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, - 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0xa2, 0x19, 0x0, 0xf0, 0x15, - 0xe1, 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, - 0xfa, 0xfc, 0x64, 0x4, 0x0, 0xf0, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, - 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0xe5, 0x3b, 0x17, 0x0, - 0xef, 0xc, 0x9c, 0xe1, 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, - 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, 0x64, 0x4, 0x0, 0xf2, 0xcc, 0xce, 0xd0, - 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0x2, - 0xe9, 0xfe, 0x8d, 0x13, 0x13, 0x0, 0xed, 0x2, 0x53, 0xc9, 0xdf, 0xe1, - 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, - 0xfc, 0x63, 0x4, 0x0, 0xec, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, - 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xe0, 0x66, - 0x4, 0x10, 0x0, 0xec, 0x31, 0xad, 0xdb, 0xdd, 0xdf, 0xe1, 0xe3, 0xe5, - 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, 0x5a, - 0x4, 0x0, 0xeb, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, - 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xc9, 0x3e, - 0xd, 0x0, 0xea, 0x16, 0x8a, 0xd7, 0xd9, 0xdb, 0xdd, 0xdf, 0xe1, 0xe3, - 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, - 0x5a, 0x4, 0x0, 0xe9, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, - 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, - 0xf5, 0xa6, 0x1e, 0x9, 0x0, 0xe8, 0x7, 0x66, 0xcb, 0xd5, 0xd7, 0xd9, - 0xdb, 0xdd, 0xdf, 0xe1, 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, - 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, 0x5a, 0x4, 0x0, 0xe7, 0xcc, 0xce, 0xd0, - 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0xe9, - 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf7, 0xf1, 0x7e, 0x6, 0x6, 0x0, - 0xe7, 0x3f, 0xb5, 0xd1, 0xd3, 0xd5, 0xd7, 0xd9, 0xdb, 0xdd, 0xdf, 0xe1, - 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, - 0xfc, 0x5a, 0x4, 0x0, 0xe7, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, - 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, - 0xf3, 0xf5, 0xf7, 0xf9, 0xfb, 0x9d, 0x5, 0x0, 0xe6, 0x12, 0xcd, 0xcf, - 0xd1, 0xd3, 0xd5, 0xd7, 0xd9, 0xdb, 0xdd, 0xdf, 0xe1, 0xe3, 0xe5, 0xe7, - 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, 0x5a, 0x4, - 0x0, 0xe7, 0xcc, 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, - 0xe0, 0xe2, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf7, - 0xf9, 0xfb, 0xf6, 0x5, 0x0, 0xe6, 0x2b, 0xcd, 0xcf, 0xd1, 0xd3, 0xd5, - 0xd7, 0xd9, 0xdb, 0xdd, 0xdf, 0xe1, 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, - 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xfa, 0xfc, 0x58, 0x4, 0x0, 0xe7, 0xa3, - 0xce, 0xd0, 0xd2, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, - 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf7, 0xf9, 0xfb, 0xfd, - 0x5, 0x0, 0xe6, 0x2d, 0xcd, 0xcf, 0xd1, 0xd3, 0xd5, 0xd7, 0xd9, 0xdb, - 0xdd, 0xdf, 0xe1, 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, - 0xf5, 0xf8, 0xfa, 0xfc, 0x34, 0x4, 0x0, 0xe7, 0x1c, 0xa1, 0xd0, 0xd2, - 0xd4, 0xd6, 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0xe9, 0xeb, - 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf7, 0xf9, 0xfb, 0xfd, 0x5, 0x0, 0xe7, - 0x2d, 0xcd, 0xcf, 0xd1, 0xd3, 0xd5, 0xd7, 0xd9, 0xdb, 0xdd, 0xdf, 0xe1, - 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf8, 0xed, - 0x6f, 0x6, 0x0, 0xe8, 0x1, 0x4c, 0xbd, 0xd4, 0xd6, 0xd8, 0xda, 0xdc, - 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, - 0xf7, 0xf9, 0xfb, 0xfd, 0x5, 0x0, 0xe8, 0x2d, 0xcd, 0xcf, 0xd1, 0xd3, - 0xd5, 0xd7, 0xd9, 0xdb, 0xdd, 0xdf, 0xe1, 0xe3, 0xe5, 0xe7, 0xe9, 0xeb, - 0xed, 0xef, 0xf1, 0xf3, 0xf4, 0x99, 0x17, 0x9, 0x0, 0xea, 0xb, 0x72, - 0xd2, 0xd8, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, - 0xef, 0xf1, 0xf3, 0xf5, 0xf7, 0xf9, 0xfb, 0xfd, 0x5, 0x0, 0xea, 0x2d, - 0xcd, 0xcf, 0xd1, 0xd3, 0xd5, 0xd7, 0xd9, 0xdb, 0xdd, 0xdf, 0xe1, 0xe3, - 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xbd, 0x32, 0xd, 0x0, 0xec, - 0x1f, 0x99, 0xda, 0xdc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, - 0xef, 0xf1, 0xf3, 0xf5, 0xf7, 0xf9, 0xfb, 0xfd, 0x5, 0x0, 0xeb, 0x2d, - 0xcd, 0xcf, 0xd1, 0xd3, 0xd5, 0xd7, 0xd9, 0xdb, 0xdd, 0xdf, 0xe1, 0xe3, - 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xd7, 0x55, 0x1, 0x10, 0x0, 0xee, 0x3f, - 0xbc, 0xde, 0xe0, 0xe2, 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, - 0xf5, 0xf7, 0xf9, 0xfb, 0xfd, 0x5, 0x0, 0xed, 0x2d, 0xcd, 0xcf, 0xd1, - 0xd3, 0xd5, 0xd7, 0xd9, 0xdb, 0xdd, 0xdf, 0xe1, 0xe3, 0xe5, 0xe7, 0xe9, - 0xe4, 0x7b, 0xa, 0x13, 0x0, 0xef, 0x5, 0x68, 0xd5, 0xe2, 0xe5, 0xe7, - 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf7, 0xf9, 0xfb, 0xfd, 0x5, - 0x0, 0xef, 0x2d, 0xcd, 0xcf, 0xd1, 0xd3, 0xd5, 0xd7, 0xd9, 0xdb, 0xdd, - 0xdf, 0xe1, 0xe3, 0xe5, 0xe7, 0x9d, 0x1e, 0x17, 0x0, 0xf1, 0x16, 0x90, - 0xe5, 0xe7, 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf7, 0xf9, 0xfb, - 0xfd, 0x5, 0x0, 0xf1, 0x2d, 0xcd, 0xcf, 0xd1, 0xd3, 0xd5, 0xd7, 0xd9, - 0xdb, 0xdd, 0xdf, 0xe1, 0xe3, 0xbd, 0x3b, 0x1b, 0x0, 0xf3, 0x33, 0xb8, - 0xe9, 0xeb, 0xed, 0xef, 0xf1, 0xf3, 0xf5, 0xf7, 0xf9, 0xfb, 0xfd, 0x5, - 0x0, 0xf2, 0x2d, 0xcd, 0xcf, 0xd1, 0xd3, 0xd5, 0xd7, 0xd9, 0xdb, 0xdd, - 0xdf, 0xd1, 0x5d, 0x4, 0x1d, 0x0, 0xf4, 0x2, 0x5b, 0xd8, 0xed, 0xef, - 0xf1, 0xf3, 0xf5, 0xf7, 0xf9, 0xfb, 0xfd, 0x5, 0x0, 0xf4, 0x2d, 0xcd, - 0xcf, 0xd1, 0xd3, 0xd5, 0xd7, 0xd9, 0xdb, 0xda, 0x81, 0x10, 0x21, 0x0, - 0xf6, 0xe, 0x85, 0xec, 0xf1, 0xf3, 0xf5, 0xf7, 0xf9, 0xfb, 0xfd, 0x5, - 0x0, 0xf6, 0x2d, 0xcd, 0xcf, 0xd1, 0xd3, 0xd5, 0xd7, 0xd9, 0xa1, 0x25, - 0x25, 0x0, 0xf8, 0x27, 0xb0, 0xf3, 0xf5, 0xf7, 0xf9, 0xfb, 0xfd, 0x5, - 0x0, 0xf8, 0x31, 0xcd, 0xcf, 0xd1, 0xd3, 0xd5, 0xbb, 0x44, 0x29, 0x0, - 0xfa, 0x4d, 0xd6, 0xf7, 0xf9, 0xfb, 0xfd, 0x5, 0x0, 0xf9, 0x32, 0xcd, - 0xcf, 0xd1, 0xc9, 0x65, 0x6, 0x2b, 0x0, 0xfb, 0x8, 0x78, 0xf0, 0xfb, - 0xfd, 0x5, 0x0, 0xfb, 0x32, 0xcd, 0xcf, 0x85, 0x16, 0x2f, 0x0, 0xfd, - 0x1c, 0xa5, 0xe7, 0x5, 0x0, 0xfd, 0x26, 0x9d, 0x2d, 0x55, 0x0}; -static const Image blockpit_screensaver_image = {60, 64, 2339, - blockpit_screensaver_data}; - -const VariantAnimation blockpit_screensaver = { - 392, - { - {98, 0, 125, 100, &blockpit_screensaver_image}, - {99, 0, 125, 100, &blockpit_screensaver_image}, - {100, 0, 125, 100, &blockpit_screensaver_image}, - {101, 0, 125, 100, &blockpit_screensaver_image}, - {102, 0, 125, 100, &blockpit_screensaver_image}, - {103, 0, 125, 100, &blockpit_screensaver_image}, - {104, 0, 125, 100, &blockpit_screensaver_image}, - {105, 0, 125, 100, &blockpit_screensaver_image}, - {106, 0, 125, 100, &blockpit_screensaver_image}, - {107, 0, 125, 100, &blockpit_screensaver_image}, - {108, 0, 125, 100, &blockpit_screensaver_image}, - {109, 0, 125, 100, &blockpit_screensaver_image}, - {110, 0, 125, 100, &blockpit_screensaver_image}, - {111, 0, 125, 100, &blockpit_screensaver_image}, - {112, 0, 125, 100, &blockpit_screensaver_image}, - {113, 0, 125, 100, &blockpit_screensaver_image}, - {114, 0, 125, 100, &blockpit_screensaver_image}, - {115, 0, 125, 100, &blockpit_screensaver_image}, - {116, 0, 125, 100, &blockpit_screensaver_image}, - {117, 0, 125, 100, &blockpit_screensaver_image}, - {118, 0, 125, 100, &blockpit_screensaver_image}, - {119, 0, 125, 100, &blockpit_screensaver_image}, - {120, 0, 125, 100, &blockpit_screensaver_image}, - {121, 0, 125, 100, &blockpit_screensaver_image}, - {122, 0, 125, 100, &blockpit_screensaver_image}, - {123, 0, 125, 100, &blockpit_screensaver_image}, - {124, 0, 125, 100, &blockpit_screensaver_image}, - {125, 0, 125, 100, &blockpit_screensaver_image}, - {126, 0, 125, 100, &blockpit_screensaver_image}, - {127, 0, 125, 100, &blockpit_screensaver_image}, - {128, 0, 125, 100, &blockpit_screensaver_image}, - {129, 0, 125, 100, &blockpit_screensaver_image}, - {130, 0, 125, 100, &blockpit_screensaver_image}, - {131, 0, 125, 100, &blockpit_screensaver_image}, - {132, 0, 125, 100, &blockpit_screensaver_image}, - {133, 0, 125, 100, &blockpit_screensaver_image}, - {134, 0, 125, 100, &blockpit_screensaver_image}, - {135, 0, 125, 100, &blockpit_screensaver_image}, - {136, 0, 125, 100, &blockpit_screensaver_image}, - {137, 0, 125, 100, &blockpit_screensaver_image}, - {138, 0, 125, 100, &blockpit_screensaver_image}, - {139, 0, 125, 100, &blockpit_screensaver_image}, - {140, 0, 125, 100, &blockpit_screensaver_image}, - {141, 0, 125, 100, &blockpit_screensaver_image}, - {142, 0, 125, 100, &blockpit_screensaver_image}, - {143, 0, 125, 100, &blockpit_screensaver_image}, - {144, 0, 125, 100, &blockpit_screensaver_image}, - {145, 0, 125, 100, &blockpit_screensaver_image}, - {146, 0, 125, 100, &blockpit_screensaver_image}, - {147, 0, 125, 100, &blockpit_screensaver_image}, - {148, 0, 125, 100, &blockpit_screensaver_image}, - {149, 0, 125, 100, &blockpit_screensaver_image}, - {150, 0, 125, 100, &blockpit_screensaver_image}, - {151, 0, 125, 100, &blockpit_screensaver_image}, - {152, 0, 125, 100, &blockpit_screensaver_image}, - {153, 0, 125, 100, &blockpit_screensaver_image}, - {154, 0, 125, 100, &blockpit_screensaver_image}, - {155, 0, 125, 100, &blockpit_screensaver_image}, - {156, 0, 125, 100, &blockpit_screensaver_image}, - {157, 0, 125, 100, &blockpit_screensaver_image}, - {158, 0, 125, 100, &blockpit_screensaver_image}, - {159, 0, 125, 100, &blockpit_screensaver_image}, - {160, 0, 125, 100, &blockpit_screensaver_image}, - {161, 0, 125, 100, &blockpit_screensaver_image}, - {162, 0, 125, 100, &blockpit_screensaver_image}, - {163, 0, 125, 100, &blockpit_screensaver_image}, - {164, 0, 125, 100, &blockpit_screensaver_image}, - {165, 0, 125, 100, &blockpit_screensaver_image}, - {166, 0, 125, 100, &blockpit_screensaver_image}, - {167, 0, 125, 100, &blockpit_screensaver_image}, - {168, 0, 125, 100, &blockpit_screensaver_image}, - {169, 0, 125, 100, &blockpit_screensaver_image}, - {170, 0, 125, 100, &blockpit_screensaver_image}, - {171, 0, 125, 100, &blockpit_screensaver_image}, - {172, 0, 125, 100, &blockpit_screensaver_image}, - {173, 0, 125, 100, &blockpit_screensaver_image}, - {174, 0, 125, 100, &blockpit_screensaver_image}, - {175, 0, 125, 100, &blockpit_screensaver_image}, - {176, 0, 125, 100, &blockpit_screensaver_image}, - {177, 0, 125, 100, &blockpit_screensaver_image}, - {178, 0, 125, 100, &blockpit_screensaver_image}, - {179, 0, 125, 100, &blockpit_screensaver_image}, - {180, 0, 125, 100, &blockpit_screensaver_image}, - {181, 0, 125, 100, &blockpit_screensaver_image}, - {182, 0, 125, 100, &blockpit_screensaver_image}, - {183, 0, 125, 100, &blockpit_screensaver_image}, - {184, 0, 125, 100, &blockpit_screensaver_image}, - {185, 0, 125, 100, &blockpit_screensaver_image}, - {186, 0, 125, 100, &blockpit_screensaver_image}, - {187, 0, 125, 100, &blockpit_screensaver_image}, - {188, 0, 125, 100, &blockpit_screensaver_image}, - {189, 0, 125, 100, &blockpit_screensaver_image}, - {190, 0, 125, 100, &blockpit_screensaver_image}, - {191, 0, 125, 100, &blockpit_screensaver_image}, - {192, 0, 125, 100, &blockpit_screensaver_image}, - {193, 0, 125, 100, &blockpit_screensaver_image}, - {194, 0, 125, 100, &blockpit_screensaver_image}, - {195, 0, 125, 100, &blockpit_screensaver_image}, - {194, 0, 125, 100, &blockpit_screensaver_image}, - {193, 0, 125, 100, &blockpit_screensaver_image}, - {192, 0, 125, 100, &blockpit_screensaver_image}, - {191, 0, 125, 100, &blockpit_screensaver_image}, - {190, 0, 125, 100, &blockpit_screensaver_image}, - {189, 0, 125, 100, &blockpit_screensaver_image}, - {188, 0, 125, 100, &blockpit_screensaver_image}, - {187, 0, 125, 100, &blockpit_screensaver_image}, - {186, 0, 125, 100, &blockpit_screensaver_image}, - {185, 0, 125, 100, &blockpit_screensaver_image}, - {184, 0, 125, 100, &blockpit_screensaver_image}, - {183, 0, 125, 100, &blockpit_screensaver_image}, - {182, 0, 125, 100, &blockpit_screensaver_image}, - {181, 0, 125, 100, &blockpit_screensaver_image}, - {180, 0, 125, 100, &blockpit_screensaver_image}, - {179, 0, 125, 100, &blockpit_screensaver_image}, - {178, 0, 125, 100, &blockpit_screensaver_image}, - {177, 0, 125, 100, &blockpit_screensaver_image}, - {176, 0, 125, 100, &blockpit_screensaver_image}, - {175, 0, 125, 100, &blockpit_screensaver_image}, - {174, 0, 125, 100, &blockpit_screensaver_image}, - {173, 0, 125, 100, &blockpit_screensaver_image}, - {172, 0, 125, 100, &blockpit_screensaver_image}, - {171, 0, 125, 100, &blockpit_screensaver_image}, - {170, 0, 125, 100, &blockpit_screensaver_image}, - {169, 0, 125, 100, &blockpit_screensaver_image}, - {168, 0, 125, 100, &blockpit_screensaver_image}, - {167, 0, 125, 100, &blockpit_screensaver_image}, - {166, 0, 125, 100, &blockpit_screensaver_image}, - {165, 0, 125, 100, &blockpit_screensaver_image}, - {164, 0, 125, 100, &blockpit_screensaver_image}, - {163, 0, 125, 100, &blockpit_screensaver_image}, - {162, 0, 125, 100, &blockpit_screensaver_image}, - {161, 0, 125, 100, &blockpit_screensaver_image}, - {160, 0, 125, 100, &blockpit_screensaver_image}, - {159, 0, 125, 100, &blockpit_screensaver_image}, - {158, 0, 125, 100, &blockpit_screensaver_image}, - {157, 0, 125, 100, &blockpit_screensaver_image}, - {156, 0, 125, 100, &blockpit_screensaver_image}, - {155, 0, 125, 100, &blockpit_screensaver_image}, - {154, 0, 125, 100, &blockpit_screensaver_image}, - {153, 0, 125, 100, &blockpit_screensaver_image}, - {152, 0, 125, 100, &blockpit_screensaver_image}, - {151, 0, 125, 100, &blockpit_screensaver_image}, - {150, 0, 125, 100, &blockpit_screensaver_image}, - {149, 0, 125, 100, &blockpit_screensaver_image}, - {148, 0, 125, 100, &blockpit_screensaver_image}, - {147, 0, 125, 100, &blockpit_screensaver_image}, - {146, 0, 125, 100, &blockpit_screensaver_image}, - {145, 0, 125, 100, &blockpit_screensaver_image}, - {144, 0, 125, 100, &blockpit_screensaver_image}, - {143, 0, 125, 100, &blockpit_screensaver_image}, - {142, 0, 125, 100, &blockpit_screensaver_image}, - {141, 0, 125, 100, &blockpit_screensaver_image}, - {140, 0, 125, 100, &blockpit_screensaver_image}, - {139, 0, 125, 100, &blockpit_screensaver_image}, - {138, 0, 125, 100, &blockpit_screensaver_image}, - {137, 0, 125, 100, &blockpit_screensaver_image}, - {136, 0, 125, 100, &blockpit_screensaver_image}, - {135, 0, 125, 100, &blockpit_screensaver_image}, - {134, 0, 125, 100, &blockpit_screensaver_image}, - {133, 0, 125, 100, &blockpit_screensaver_image}, - {132, 0, 125, 100, &blockpit_screensaver_image}, - {131, 0, 125, 100, &blockpit_screensaver_image}, - {130, 0, 125, 100, &blockpit_screensaver_image}, - {129, 0, 125, 100, &blockpit_screensaver_image}, - {128, 0, 125, 100, &blockpit_screensaver_image}, - {127, 0, 125, 100, &blockpit_screensaver_image}, - {126, 0, 125, 100, &blockpit_screensaver_image}, - {125, 0, 125, 100, &blockpit_screensaver_image}, - {124, 0, 125, 100, &blockpit_screensaver_image}, - {123, 0, 125, 100, &blockpit_screensaver_image}, - {122, 0, 125, 100, &blockpit_screensaver_image}, - {121, 0, 125, 100, &blockpit_screensaver_image}, - {120, 0, 125, 100, &blockpit_screensaver_image}, - {119, 0, 125, 100, &blockpit_screensaver_image}, - {118, 0, 125, 100, &blockpit_screensaver_image}, - {117, 0, 125, 100, &blockpit_screensaver_image}, - {116, 0, 125, 100, &blockpit_screensaver_image}, - {115, 0, 125, 100, &blockpit_screensaver_image}, - {114, 0, 125, 100, &blockpit_screensaver_image}, - {113, 0, 125, 100, &blockpit_screensaver_image}, - {112, 0, 125, 100, &blockpit_screensaver_image}, - {111, 0, 125, 100, &blockpit_screensaver_image}, - {110, 0, 125, 100, &blockpit_screensaver_image}, - {109, 0, 125, 100, &blockpit_screensaver_image}, - {108, 0, 125, 100, &blockpit_screensaver_image}, - {107, 0, 125, 100, &blockpit_screensaver_image}, - {106, 0, 125, 100, &blockpit_screensaver_image}, - {105, 0, 125, 100, &blockpit_screensaver_image}, - {104, 0, 125, 100, &blockpit_screensaver_image}, - {103, 0, 125, 100, &blockpit_screensaver_image}, - {102, 0, 125, 100, &blockpit_screensaver_image}, - {101, 0, 125, 100, &blockpit_screensaver_image}, - {100, 0, 125, 100, &blockpit_screensaver_image}, - {99, 0, 125, 100, &blockpit_screensaver_image}, - {98, 0, 125, 100, &blockpit_screensaver_image}, - {97, 0, 125, 100, &blockpit_screensaver_image}, - {96, 0, 125, 100, &blockpit_screensaver_image}, - {95, 0, 125, 100, &blockpit_screensaver_image}, - {94, 0, 125, 100, &blockpit_screensaver_image}, - {93, 0, 125, 100, &blockpit_screensaver_image}, - {92, 0, 125, 100, &blockpit_screensaver_image}, - {91, 0, 125, 100, &blockpit_screensaver_image}, - {90, 0, 125, 100, &blockpit_screensaver_image}, - {89, 0, 125, 100, &blockpit_screensaver_image}, - {88, 0, 125, 100, &blockpit_screensaver_image}, - {87, 0, 125, 100, &blockpit_screensaver_image}, - {86, 0, 125, 100, &blockpit_screensaver_image}, - {85, 0, 125, 100, &blockpit_screensaver_image}, - {84, 0, 125, 100, &blockpit_screensaver_image}, - {83, 0, 125, 100, &blockpit_screensaver_image}, - {82, 0, 125, 100, &blockpit_screensaver_image}, - {81, 0, 125, 100, &blockpit_screensaver_image}, - {80, 0, 125, 100, &blockpit_screensaver_image}, - {79, 0, 125, 100, &blockpit_screensaver_image}, - {78, 0, 125, 100, &blockpit_screensaver_image}, - {77, 0, 125, 100, &blockpit_screensaver_image}, - {76, 0, 125, 100, &blockpit_screensaver_image}, - {75, 0, 125, 100, &blockpit_screensaver_image}, - {74, 0, 125, 100, &blockpit_screensaver_image}, - {73, 0, 125, 100, &blockpit_screensaver_image}, - {72, 0, 125, 100, &blockpit_screensaver_image}, - {71, 0, 125, 100, &blockpit_screensaver_image}, - {70, 0, 125, 100, &blockpit_screensaver_image}, - {69, 0, 125, 100, &blockpit_screensaver_image}, - {68, 0, 125, 100, &blockpit_screensaver_image}, - {67, 0, 125, 100, &blockpit_screensaver_image}, - {66, 0, 125, 100, &blockpit_screensaver_image}, - {65, 0, 125, 100, &blockpit_screensaver_image}, - {64, 0, 125, 100, &blockpit_screensaver_image}, - {63, 0, 125, 100, &blockpit_screensaver_image}, - {62, 0, 125, 100, &blockpit_screensaver_image}, - {61, 0, 125, 100, &blockpit_screensaver_image}, - {60, 0, 125, 100, &blockpit_screensaver_image}, - {59, 0, 125, 100, &blockpit_screensaver_image}, - {58, 0, 125, 100, &blockpit_screensaver_image}, - {57, 0, 125, 100, &blockpit_screensaver_image}, - {56, 0, 125, 100, &blockpit_screensaver_image}, - {55, 0, 125, 100, &blockpit_screensaver_image}, - {54, 0, 125, 100, &blockpit_screensaver_image}, - {53, 0, 125, 100, &blockpit_screensaver_image}, - {52, 0, 125, 100, &blockpit_screensaver_image}, - {51, 0, 125, 100, &blockpit_screensaver_image}, - {50, 0, 125, 100, &blockpit_screensaver_image}, - {49, 0, 125, 100, &blockpit_screensaver_image}, - {48, 0, 125, 100, &blockpit_screensaver_image}, - {47, 0, 125, 100, &blockpit_screensaver_image}, - {46, 0, 125, 100, &blockpit_screensaver_image}, - {45, 0, 125, 100, &blockpit_screensaver_image}, - {44, 0, 125, 100, &blockpit_screensaver_image}, - {43, 0, 125, 100, &blockpit_screensaver_image}, - {42, 0, 125, 100, &blockpit_screensaver_image}, - {41, 0, 125, 100, &blockpit_screensaver_image}, - {40, 0, 125, 100, &blockpit_screensaver_image}, - {39, 0, 125, 100, &blockpit_screensaver_image}, - {38, 0, 125, 100, &blockpit_screensaver_image}, - {37, 0, 125, 100, &blockpit_screensaver_image}, - {36, 0, 125, 100, &blockpit_screensaver_image}, - {35, 0, 125, 100, &blockpit_screensaver_image}, - {34, 0, 125, 100, &blockpit_screensaver_image}, - {33, 0, 125, 100, &blockpit_screensaver_image}, - {32, 0, 125, 100, &blockpit_screensaver_image}, - {31, 0, 125, 100, &blockpit_screensaver_image}, - {30, 0, 125, 100, &blockpit_screensaver_image}, - {29, 0, 125, 100, &blockpit_screensaver_image}, - {28, 0, 125, 100, &blockpit_screensaver_image}, - {27, 0, 125, 100, &blockpit_screensaver_image}, - {26, 0, 125, 100, &blockpit_screensaver_image}, - {25, 0, 125, 100, &blockpit_screensaver_image}, - {24, 0, 125, 100, &blockpit_screensaver_image}, - {23, 0, 125, 100, &blockpit_screensaver_image}, - {22, 0, 125, 100, &blockpit_screensaver_image}, - {21, 0, 125, 100, &blockpit_screensaver_image}, - {20, 0, 125, 100, &blockpit_screensaver_image}, - {19, 0, 125, 100, &blockpit_screensaver_image}, - {18, 0, 125, 100, &blockpit_screensaver_image}, - {17, 0, 125, 100, &blockpit_screensaver_image}, - {16, 0, 125, 100, &blockpit_screensaver_image}, - {15, 0, 125, 100, &blockpit_screensaver_image}, - {14, 0, 125, 100, &blockpit_screensaver_image}, - {13, 0, 125, 100, &blockpit_screensaver_image}, - {12, 0, 125, 100, &blockpit_screensaver_image}, - {11, 0, 125, 100, &blockpit_screensaver_image}, - {10, 0, 125, 100, &blockpit_screensaver_image}, - {9, 0, 125, 100, &blockpit_screensaver_image}, - {8, 0, 125, 100, &blockpit_screensaver_image}, - {7, 0, 125, 100, &blockpit_screensaver_image}, - {6, 0, 125, 100, &blockpit_screensaver_image}, - {5, 0, 125, 100, &blockpit_screensaver_image}, - {4, 0, 125, 100, &blockpit_screensaver_image}, - {3, 0, 125, 100, &blockpit_screensaver_image}, - {2, 0, 125, 100, &blockpit_screensaver_image}, - {1, 0, 125, 100, &blockpit_screensaver_image}, - {0, 0, 125, 100, &blockpit_screensaver_image}, - {0, 0, 125, 100, &blockpit_screensaver_image}, - {1, 0, 125, 100, &blockpit_screensaver_image}, - {2, 0, 125, 100, &blockpit_screensaver_image}, - {3, 0, 125, 100, &blockpit_screensaver_image}, - {4, 0, 125, 100, &blockpit_screensaver_image}, - {5, 0, 125, 100, &blockpit_screensaver_image}, - {6, 0, 125, 100, &blockpit_screensaver_image}, - {7, 0, 125, 100, &blockpit_screensaver_image}, - {8, 0, 125, 100, &blockpit_screensaver_image}, - {9, 0, 125, 100, &blockpit_screensaver_image}, - {10, 0, 125, 100, &blockpit_screensaver_image}, - {11, 0, 125, 100, &blockpit_screensaver_image}, - {12, 0, 125, 100, &blockpit_screensaver_image}, - {13, 0, 125, 100, &blockpit_screensaver_image}, - {14, 0, 125, 100, &blockpit_screensaver_image}, - {15, 0, 125, 100, &blockpit_screensaver_image}, - {16, 0, 125, 100, &blockpit_screensaver_image}, - {17, 0, 125, 100, &blockpit_screensaver_image}, - {18, 0, 125, 100, &blockpit_screensaver_image}, - {19, 0, 125, 100, &blockpit_screensaver_image}, - {20, 0, 125, 100, &blockpit_screensaver_image}, - {21, 0, 125, 100, &blockpit_screensaver_image}, - {22, 0, 125, 100, &blockpit_screensaver_image}, - {23, 0, 125, 100, &blockpit_screensaver_image}, - {24, 0, 125, 100, &blockpit_screensaver_image}, - {25, 0, 125, 100, &blockpit_screensaver_image}, - {26, 0, 125, 100, &blockpit_screensaver_image}, - {27, 0, 125, 100, &blockpit_screensaver_image}, - {28, 0, 125, 100, &blockpit_screensaver_image}, - {29, 0, 125, 100, &blockpit_screensaver_image}, - {30, 0, 125, 100, &blockpit_screensaver_image}, - {31, 0, 125, 100, &blockpit_screensaver_image}, - {32, 0, 125, 100, &blockpit_screensaver_image}, - {33, 0, 125, 100, &blockpit_screensaver_image}, - {34, 0, 125, 100, &blockpit_screensaver_image}, - {35, 0, 125, 100, &blockpit_screensaver_image}, - {36, 0, 125, 100, &blockpit_screensaver_image}, - {37, 0, 125, 100, &blockpit_screensaver_image}, - {38, 0, 125, 100, &blockpit_screensaver_image}, - {39, 0, 125, 100, &blockpit_screensaver_image}, - {40, 0, 125, 100, &blockpit_screensaver_image}, - {41, 0, 125, 100, &blockpit_screensaver_image}, - {42, 0, 125, 100, &blockpit_screensaver_image}, - {43, 0, 125, 100, &blockpit_screensaver_image}, - {44, 0, 125, 100, &blockpit_screensaver_image}, - {45, 0, 125, 100, &blockpit_screensaver_image}, - {46, 0, 125, 100, &blockpit_screensaver_image}, - {47, 0, 125, 100, &blockpit_screensaver_image}, - {48, 0, 125, 100, &blockpit_screensaver_image}, - {49, 0, 125, 100, &blockpit_screensaver_image}, - {50, 0, 125, 100, &blockpit_screensaver_image}, - {51, 0, 125, 100, &blockpit_screensaver_image}, - {52, 0, 125, 100, &blockpit_screensaver_image}, - {53, 0, 125, 100, &blockpit_screensaver_image}, - {54, 0, 125, 100, &blockpit_screensaver_image}, - {55, 0, 125, 100, &blockpit_screensaver_image}, - {56, 0, 125, 100, &blockpit_screensaver_image}, - {57, 0, 125, 100, &blockpit_screensaver_image}, - {58, 0, 125, 100, &blockpit_screensaver_image}, - {59, 0, 125, 100, &blockpit_screensaver_image}, - {60, 0, 125, 100, &blockpit_screensaver_image}, - {61, 0, 125, 100, &blockpit_screensaver_image}, - {62, 0, 125, 100, &blockpit_screensaver_image}, - {63, 0, 125, 100, &blockpit_screensaver_image}, - {64, 0, 125, 100, &blockpit_screensaver_image}, - {65, 0, 125, 100, &blockpit_screensaver_image}, - {66, 0, 125, 100, &blockpit_screensaver_image}, - {67, 0, 125, 100, &blockpit_screensaver_image}, - {68, 0, 125, 100, &blockpit_screensaver_image}, - {69, 0, 125, 100, &blockpit_screensaver_image}, - {70, 0, 125, 100, &blockpit_screensaver_image}, - {71, 0, 125, 100, &blockpit_screensaver_image}, - {72, 0, 125, 100, &blockpit_screensaver_image}, - {73, 0, 125, 100, &blockpit_screensaver_image}, - {74, 0, 125, 100, &blockpit_screensaver_image}, - {75, 0, 125, 100, &blockpit_screensaver_image}, - {76, 0, 125, 100, &blockpit_screensaver_image}, - {77, 0, 125, 100, &blockpit_screensaver_image}, - {78, 0, 125, 100, &blockpit_screensaver_image}, - {79, 0, 125, 100, &blockpit_screensaver_image}, - {80, 0, 125, 100, &blockpit_screensaver_image}, - {81, 0, 125, 100, &blockpit_screensaver_image}, - {82, 0, 125, 100, &blockpit_screensaver_image}, - {83, 0, 125, 100, &blockpit_screensaver_image}, - {84, 0, 125, 100, &blockpit_screensaver_image}, - {85, 0, 125, 100, &blockpit_screensaver_image}, - {86, 0, 125, 100, &blockpit_screensaver_image}, - {87, 0, 125, 100, &blockpit_screensaver_image}, - {88, 0, 125, 100, &blockpit_screensaver_image}, - {89, 0, 125, 100, &blockpit_screensaver_image}, - {90, 0, 125, 100, &blockpit_screensaver_image}, - {91, 0, 125, 100, &blockpit_screensaver_image}, - {92, 0, 125, 100, &blockpit_screensaver_image}, - {93, 0, 125, 100, &blockpit_screensaver_image}, - {94, 0, 125, 100, &blockpit_screensaver_image}, - {95, 0, 125, 100, &blockpit_screensaver_image}, - {96, 0, 125, 100, &blockpit_screensaver_image}, - {97, 0, 125, 100, &blockpit_screensaver_image}, - {98, 0, 125, 100, &blockpit_screensaver_image}, - }}; - -VariantInfo blockpit_svi __attribute__((section("variant_info"))) = { - .version = 1, - .name = "blockpit", - .logo = &blockpit_logo, - .logo_reversed = &blockpit_logo_reversed, - .screensaver_timeout = ONE_SEC * 60 * 10, - .screensaver = &blockpit_screensaver}; diff --git a/tools/variant/dash.c b/tools/variant/dash.c deleted file mode 100644 index a28ef2e69..000000000 --- a/tools/variant/dash.c +++ /dev/null @@ -1,663 +0,0 @@ -/* - * This file is part of the KeepKey project. - * - * Copyright (C) 2018 KeepKey LLC - * - * This library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see . - */ - -#include "keepkey/board/variant.h" - -#include "keepkey/board/timer.h" - -const uint8_t dash_logo_data[2863] = { - 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, - 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, - 0x3b, 0x0, 0xfd, 0x27, 0xba, 0xf1, 0x16, 0xe6, 0xf5, 0xe3, 0xde, 0xd4, - 0xc7, 0xad, 0x8a, 0x64, 0x39, 0x18, 0x9, 0x1, 0x6c, 0x0, 0xfd, 0x5, - 0x96, 0xed, 0x8, 0xe6, 0xfc, 0xe7, 0xf2, 0xb7, 0x1f, 0x61, 0x0, 0xfe, - 0x49, 0xe0, 0x1e, 0xff, 0xfa, 0xfb, 0xd9, 0x9e, 0x58, 0x1b, 0x4, 0x6a, - 0x0, 0xfe, 0x8, 0xcc, 0xb, 0xff, 0xfe, 0xbd, 0x18, 0x61, 0x0, 0xfe, - 0x67, 0xf3, 0x21, 0xff, 0xfb, 0xfd, 0xd2, 0x7d, 0x23, 0x5, 0x68, 0x0, - 0xfe, 0x1b, 0xec, 0xa, 0xff, 0xfd, 0xfe, 0x9d, 0x8, 0x61, 0x0, 0xff, - 0x8c, 0x25, 0xff, 0xfc, 0xdf, 0x7c, 0x19, 0x1, 0x65, 0x0, 0xfd, 0x1, - 0x46, 0xfd, 0xa, 0xff, 0xfe, 0xf4, 0x78, 0x61, 0x0, 0xfe, 0xa, 0xaa, - 0x27, 0xff, 0xfe, 0xb1, 0x25, 0x65, 0x0, 0xfe, 0x2, 0x6f, 0xb, 0xff, - 0xfe, 0xe9, 0x5b, 0x61, 0x0, 0xfe, 0x23, 0xc1, 0x28, 0xff, 0xfd, 0xb1, - 0x23, 0x1, 0x63, 0x0, 0xfe, 0x3, 0x98, 0xb, 0xff, 0xfe, 0xda, 0x3e, - 0x61, 0x0, 0xfe, 0x37, 0xd1, 0x29, 0xff, 0xfe, 0xae, 0x20, 0x63, 0x0, - 0xfe, 0x6, 0xc2, 0xb, 0xff, 0xfe, 0xc1, 0x20, 0x61, 0x0, 0xfe, 0x47, - 0xde, 0x2a, 0xff, 0xfe, 0x8e, 0x9, 0x62, 0x0, 0xfe, 0x1c, 0xe0, 0xb, - 0xff, 0xfe, 0xa3, 0x5, 0x61, 0x0, 0xfe, 0x5e, 0xf0, 0x2a, 0xff, 0xfe, - 0xd7, 0x37, 0x62, 0x0, 0xfe, 0x3f, 0xed, 0xa, 0xff, 0xfe, 0xfb, 0x89, - 0x61, 0x0, 0xfe, 0x1, 0x83, 0x2c, 0xff, 0xfe, 0x84, 0x7, 0x61, 0x0, - 0xfe, 0x66, 0xf9, 0xa, 0xff, 0xfe, 0xef, 0x69, 0x61, 0x0, 0xfc, 0x8, - 0x78, 0xc6, 0xc4, 0x4, 0xc2, 0x6, 0xc3, 0x7, 0xc4, 0x2, 0xc5, 0xfa, - 0xc9, 0xd0, 0xda, 0xe8, 0xf0, 0xfa, 0x11, 0xff, 0xfe, 0xd8, 0x31, 0x60, - 0x0, 0xfe, 0x1, 0x83, 0xb, 0xff, 0xfe, 0xdf, 0x46, 0x61, 0x0, 0xfc, - 0x3, 0x10, 0x17, 0x16, 0x3, 0x15, 0xff, 0x16, 0x7, 0x17, 0x6, 0x18, - 0x2, 0x1a, 0xf8, 0x20, 0x28, 0x37, 0x4e, 0x6d, 0x99, 0xcb, 0xec, 0x10, - 0xff, 0xfe, 0x63, 0x1, 0x60, 0x0, 0xff, 0x93, 0xb, 0xff, 0xfe, 0xcb, - 0x24, 0x7e, 0x0, 0xfc, 0x22, 0x5d, 0xb9, 0xf0, 0xe, 0xff, 0xfe, 0x9a, - 0x11, 0x5f, 0x0, 0xfe, 0x3, 0xae, 0xb, 0xff, 0xff, 0xae, 0x7f, 0x0, - 0x2, 0x0, 0xfd, 0xf, 0x75, 0xea, 0xd, 0xff, 0xfe, 0xcb, 0x28, 0x13, - 0x0, 0xfa, 0x6, 0x14, 0x20, 0x28, 0x2f, 0x35, 0x14, 0x39, 0xfd, 0x3a, - 0x3b, 0x11, 0xd, 0x0, 0xfb, 0x6, 0x19, 0x25, 0x2e, 0x35, 0x14, 0x37, - 0xfd, 0x3e, 0x21, 0x3, 0x6, 0x0, 0xfe, 0x17, 0xcb, 0xb, 0xff, 0xfd, - 0xac, 0x2f, 0x37, 0x7, 0x39, 0xfa, 0x38, 0x32, 0x2c, 0x26, 0x1b, 0xc, - 0x74, 0x0, 0xfe, 0x6d, 0xf2, 0xc, 0xff, 0xfe, 0xe9, 0x36, 0x10, 0x0, - 0xf7, 0xa, 0x26, 0x4b, 0x76, 0xa0, 0xc3, 0xdb, 0xeb, 0xf3, 0x14, 0xf6, - 0xfc, 0xfa, 0xf5, 0x42, 0x1, 0xa, 0x0, 0xf9, 0x12, 0x3d, 0x76, 0xad, - 0xd1, 0xea, 0xf4, 0x13, 0xf5, 0xfc, 0xf4, 0xff, 0x81, 0xa, 0x6, 0x0, - 0xfe, 0x34, 0xe3, 0xa, 0xff, 0xfd, 0xfe, 0xf7, 0xf2, 0x8, 0xf6, 0xf7, - 0xf5, 0xf1, 0xe6, 0xd5, 0xb5, 0x88, 0x5a, 0x29, 0x7, 0x71, 0x0, 0xfe, - 0x10, 0xa8, 0xc, 0xff, 0xfe, 0xfa, 0x45, 0xe, 0x0, 0xfc, 0x1b, 0x45, - 0x84, 0xc6, 0x1c, 0xff, 0xfe, 0xe2, 0x30, 0x9, 0x0, 0xfc, 0xb, 0x43, - 0x99, 0xe8, 0x1a, 0xff, 0xfe, 0x66, 0x5, 0x6, 0x0, 0xfe, 0x51, 0xf8, - 0x1c, 0xff, 0xfc, 0xcd, 0x76, 0x2d, 0x2, 0x70, 0x0, 0xfe, 0x5d, 0xf5, - 0xc, 0xff, 0xff, 0x59, 0xc, 0x0, 0xfc, 0x15, 0x59, 0xad, 0xe7, 0x1e, - 0xff, 0xfe, 0xb4, 0x18, 0x8, 0x0, 0xfd, 0x1d, 0x84, 0xe5, 0x1b, 0xff, - 0xfe, 0xf7, 0x40, 0x7, 0x0, 0xff, 0x77, 0x1f, 0xff, 0xfd, 0xd1, 0x5a, - 0x4, 0x6f, 0x0, 0xfe, 0x29, 0xcb, 0xc, 0xff, 0xff, 0x61, 0xb, 0x0, - 0xfd, 0x27, 0x9c, 0xf5, 0x20, 0xff, 0xfe, 0x9e, 0xf, 0x7, 0x0, 0xfe, - 0x19, 0xa9, 0x1d, 0xff, 0xfe, 0xd1, 0x2a, 0x6, 0x0, 0xfd, 0x3, 0x9c, - 0xfe, 0x1f, 0xff, 0xfd, 0xec, 0x50, 0x1, 0x6e, 0x0, 0xfe, 0x1a, 0xad, - 0xc, 0xff, 0xff, 0x61, 0xa, 0x0, 0xfe, 0x36, 0xc1, 0x22, 0xff, 0xfe, - 0x8d, 0xd, 0x6, 0x0, 0xfe, 0x7, 0x92, 0x1e, 0xff, 0xfe, 0xaf, 0x18, - 0x6, 0x0, 0xfd, 0x12, 0xbb, 0xfe, 0x20, 0xff, 0xfd, 0xd6, 0x2b, 0x1, - 0x6d, 0x0, 0xfe, 0x11, 0x9a, 0xc, 0xff, 0xff, 0x5f, 0x9, 0x0, 0xfe, - 0x55, 0xd6, 0x23, 0xff, 0xfe, 0x73, 0x8, 0x6, 0x0, 0xfe, 0x65, 0xf7, - 0x1e, 0xff, 0xfe, 0x8a, 0xc, 0x6, 0x0, 0xfe, 0x26, 0xde, 0x22, 0xff, - 0xfe, 0x8b, 0xb, 0x40, 0x0, 0xfc, 0x11, 0x35, 0x57, 0x65, 0x16, 0x68, - 0xfd, 0x6e, 0x4b, 0x7, 0x10, 0x0, 0xfe, 0xf, 0x92, 0xc, 0xff, 0xff, - 0x56, 0x8, 0x0, 0xfe, 0x43, 0xec, 0x23, 0xff, 0xfd, 0xfa, 0x55, 0x3, - 0x5, 0x0, 0xfe, 0x24, 0xe6, 0x1f, 0xff, 0xfe, 0x67, 0x4, 0x6, 0x0, - 0xfe, 0x3f, 0xf8, 0x22, 0xff, 0xfd, 0xdc, 0x2b, 0x1, 0x3e, 0x0, 0xfb, - 0x40, 0x9a, 0xd2, 0xef, 0xf9, 0x16, 0xfb, 0xfd, 0xff, 0xa8, 0xd, 0x10, - 0x0, 0xfe, 0x10, 0x96, 0xb, 0xff, 0xfe, 0xfc, 0x48, 0x7, 0x0, 0xfe, - 0x21, 0xcd, 0x24, 0xff, 0xfe, 0xe3, 0x38, 0x6, 0x0, 0xff, 0x8e, 0x1f, - 0xff, 0xfd, 0xfa, 0x4d, 0x1, 0x6, 0x0, 0xfe, 0x61, 0xfc, 0x22, 0xff, - 0xfd, 0xfc, 0x50, 0x3, 0x3c, 0x0, 0xfd, 0x2, 0x54, 0xda, 0x1b, 0xff, - 0xfe, 0x89, 0x7, 0x10, 0x0, 0xfe, 0x16, 0xa5, 0xb, 0xff, 0xfe, 0xee, - 0x39, 0x6, 0x0, 0xfe, 0x13, 0xa9, 0x11, 0xff, 0xfd, 0xf3, 0xe8, 0xe6, - 0x3, 0xe7, 0xfd, 0xe3, 0xea, 0xfa, 0xb, 0xff, 0xfe, 0xc8, 0x1f, 0x5, - 0x0, 0xfe, 0x20, 0xe8, 0xc, 0xff, 0xfe, 0xed, 0xe5, 0xf, 0xe7, 0xfc, - 0xe6, 0xee, 0xc4, 0x2c, 0x6, 0x0, 0xfd, 0x1, 0x8b, 0xfc, 0x23, 0xff, - 0xfe, 0x5e, 0x3, 0x3b, 0x0, 0xfd, 0x1, 0x31, 0xdf, 0x1c, 0xff, 0xfe, - 0x53, 0x3, 0x10, 0x0, 0xfe, 0x22, 0xbc, 0xb, 0xff, 0xfe, 0xd9, 0x2e, - 0x6, 0x0, 0xfe, 0x79, 0xfe, 0xd, 0xff, 0xf9, 0xf9, 0xcd, 0x9f, 0x79, - 0x63, 0x55, 0x52, 0x3, 0x53, 0xfd, 0x4d, 0x7a, 0xe6, 0xb, 0xff, 0xfe, - 0xa5, 0x11, 0x5, 0x0, 0xfe, 0x65, 0xfd, 0xa, 0xff, 0xfc, 0xec, 0x92, - 0x59, 0x51, 0xf, 0x53, 0xfc, 0x52, 0x5c, 0x40, 0x8, 0x6, 0x0, 0xfd, - 0x8, 0xb7, 0xfd, 0xa, 0xff, 0xfc, 0xe3, 0x90, 0x86, 0x8d, 0x2, 0x8c, - 0xfb, 0x8b, 0x8e, 0x9c, 0xb9, 0xec, 0xe, 0xff, 0xfe, 0x61, 0x5, 0x3b, - 0x0, 0xfe, 0xa, 0x8c, 0x1c, 0xff, 0xfd, 0xec, 0x31, 0x1, 0x10, 0x0, - 0xfe, 0x31, 0xd3, 0xb, 0xff, 0xfe, 0xc0, 0x23, 0x5, 0x0, 0xfe, 0x25, - 0xd9, 0xd, 0xff, 0xfc, 0xc8, 0x6a, 0x32, 0x2, 0x8, 0x0, 0xfe, 0x41, - 0xea, 0xb, 0xff, 0xfe, 0x85, 0xc, 0x5, 0x0, 0xfe, 0x8e, 0xfc, 0x9, - 0xff, 0xfe, 0xf7, 0x8f, 0x1c, 0x0, 0xfe, 0x12, 0xdc, 0xa, 0xff, 0xfe, - 0xfd, 0xa9, 0x8, 0x0, 0xfd, 0x1b, 0x5c, 0xd1, 0xd, 0xff, 0xfe, 0x63, - 0x5, 0x3b, 0x0, 0xfe, 0x24, 0xd8, 0x1c, 0xff, 0xfe, 0xbb, 0x16, 0x11, - 0x0, 0xfe, 0x4e, 0xed, 0xb, 0xff, 0xfe, 0xa1, 0x14, 0x5, 0x0, 0xfe, - 0x75, 0xf8, 0xb, 0xff, 0xfd, 0xf6, 0x98, 0x2f, 0xb, 0x0, 0xfe, 0x6c, - 0xfe, 0xa, 0xff, 0xfd, 0xfc, 0x63, 0x5, 0x5, 0x0, 0xfe, 0xb4, 0xfe, - 0x9, 0xff, 0xfe, 0xe0, 0x3e, 0x1c, 0x0, 0xfe, 0x2f, 0xf3, 0xa, 0xff, - 0xfe, 0xf5, 0x83, 0xa, 0x0, 0xfe, 0x48, 0xdd, 0xc, 0xff, 0xfe, 0x63, - 0x5, 0x3a, 0x0, 0xfd, 0x3, 0x53, 0xfa, 0x1c, 0xff, 0xfe, 0x82, 0x6, - 0x10, 0x0, 0xfe, 0x3, 0x75, 0xc, 0xff, 0xfe, 0x7c, 0x4, 0x4, 0x0, - 0xfd, 0x11, 0xc7, 0xfe, 0xa, 0xff, 0xfd, 0xf5, 0x79, 0xd, 0xb, 0x0, - 0xfe, 0x7, 0x90, 0xb, 0xff, 0xfe, 0xef, 0x3b, 0x5, 0x0, 0xfe, 0x11, - 0xd3, 0xa, 0xff, 0xfe, 0xd8, 0x29, 0x1c, 0x0, 0xfe, 0x5c, 0xfa, 0xa, - 0xff, 0xfe, 0xed, 0x5d, 0xb, 0x0, 0xff, 0x8a, 0xc, 0xff, 0xfe, 0x61, - 0x4, 0x3a, 0x0, 0xfe, 0xa, 0x82, 0x1c, 0xff, 0xfd, 0xf4, 0x3c, 0x1, - 0x10, 0x0, 0xfe, 0xe, 0x96, 0xc, 0xff, 0xff, 0x59, 0x5, 0x0, 0xfe, - 0x52, 0xf1, 0xa, 0xff, 0xfd, 0xfd, 0xa9, 0x5, 0xc, 0x0, 0xfe, 0x1c, - 0xb0, 0xb, 0xff, 0xfe, 0xd8, 0x22, 0x5, 0x0, 0xfe, 0x2a, 0xdd, 0xa, - 0xff, 0xfc, 0xec, 0x6e, 0x5, 0x0, 0x9, 0x1, 0x11, 0x0, 0xfe, 0x80, - 0xfb, 0xa, 0xff, 0xfe, 0xe5, 0x3d, 0xb, 0x0, 0xfe, 0x65, 0xf8, 0xb, - 0xff, 0xfe, 0x5d, 0x4, 0x3a, 0x0, 0xfe, 0x11, 0xab, 0x1c, 0xff, 0xfe, - 0x99, 0xb, 0x11, 0x0, 0xfe, 0x18, 0xaa, 0xb, 0xff, 0xfe, 0xe7, 0x3d, - 0x5, 0x0, 0xfe, 0xa2, 0xfb, 0xa, 0xff, 0xfe, 0xed, 0x3f, 0xd, 0x0, - 0xfe, 0x2d, 0xc7, 0xb, 0xff, 0xfe, 0xba, 0x19, 0x5, 0x0, 0xfe, 0x33, - 0xe1, 0xb, 0xff, 0xfd, 0xe2, 0xa5, 0x9b, 0x8, 0x9f, 0xfa, 0x9e, 0x99, - 0x89, 0x6b, 0x3f, 0x17, 0xc, 0x0, 0xfe, 0x98, 0xfb, 0xa, 0xff, 0xfe, - 0xd4, 0x23, 0xb, 0x0, 0xfe, 0x64, 0xf4, 0xb, 0xff, 0xfe, 0x58, 0x4, - 0x3a, 0x0, 0xfe, 0x2f, 0xde, 0x1b, 0xff, 0xfe, 0xb5, 0x24, 0x12, 0x0, - 0xfe, 0x2f, 0xd1, 0xb, 0xff, 0xfe, 0xb8, 0x21, 0x4, 0x0, 0xfe, 0x1b, - 0xda, 0xa, 0xff, 0xfd, 0xfd, 0xa3, 0x5, 0xd, 0x0, 0xfe, 0x39, 0xd6, - 0xb, 0xff, 0xfe, 0x91, 0xf, 0x5, 0x0, 0xfe, 0x2e, 0xdf, 0x19, 0xff, - 0xfb, 0xf8, 0xd9, 0xb9, 0x79, 0x10, 0xa, 0x0, 0xfe, 0xb1, 0xfd, 0x9, - 0xff, 0xfd, 0xfd, 0xb3, 0xb, 0xb, 0x0, 0xfe, 0x78, 0xfc, 0xa, 0xff, - 0xfd, 0xf7, 0x49, 0x2, 0x39, 0x0, 0xfe, 0x2, 0x58, 0x19, 0xff, 0xfc, - 0xf4, 0xce, 0x89, 0x25, 0x13, 0x0, 0xfe, 0x56, 0xf9, 0xb, 0xff, 0xfe, - 0x89, 0x8, 0x4, 0x0, 0xfe, 0x58, 0xee, 0xa, 0xff, 0xfe, 0xf2, 0x4f, - 0xe, 0x0, 0xfe, 0x44, 0xe5, 0xb, 0xff, 0xfe, 0x69, 0x5, 0x5, 0x0, - 0xfe, 0x15, 0xd7, 0x1c, 0xff, 0xfd, 0xf8, 0xa4, 0x1e, 0x8, 0x0, 0xfe, - 0x6, 0xd3, 0xa, 0xff, 0xfe, 0xf8, 0x92, 0xb, 0x0, 0xfe, 0x2, 0x97, - 0xb, 0xff, 0xfe, 0xdd, 0x32, 0x3a, 0x0, 0xfc, 0x2, 0x31, 0x8a, 0x80, - 0x16, 0x7f, 0xfc, 0x78, 0x5d, 0x31, 0x9, 0x13, 0x0, 0xfe, 0xb, 0x8e, - 0xb, 0xff, 0xfe, 0xf5, 0x5b, 0x5, 0x0, 0xfe, 0x8d, 0xf8, 0xa, 0xff, - 0xfe, 0xd3, 0x20, 0xe, 0x0, 0xfe, 0x5b, 0xf4, 0xa, 0xff, 0xfe, 0xfe, - 0x44, 0x6, 0x0, 0xfd, 0x2, 0xb9, 0xfe, 0x1d, 0xff, 0xfe, 0xa8, 0x16, - 0x7, 0x0, 0xfe, 0x23, 0xeb, 0xa, 0xff, 0xfe, 0xf2, 0x76, 0xb, 0x0, - 0xfe, 0x14, 0xb3, 0xb, 0xff, 0xfe, 0xc1, 0x1b, 0x3b, 0x0, 0xfe, 0x2, - 0x5, 0x17, 0x4, 0xff, 0x3, 0x16, 0x0, 0xfe, 0x32, 0xe4, 0xb, 0xff, - 0xfe, 0xcf, 0x30, 0x5, 0x0, 0xff, 0xb9, 0xa, 0xff, 0xfd, 0xfd, 0xab, - 0x4, 0xd, 0x0, 0xfd, 0x5, 0x7e, 0xfd, 0xa, 0xff, 0xfe, 0xe4, 0x29, - 0x7, 0x0, 0xff, 0x7e, 0x1e, 0xff, 0xfd, 0xfd, 0x70, 0x9, 0x6, 0x0, - 0xfe, 0x50, 0xf4, 0xa, 0xff, 0xfe, 0xed, 0x5c, 0xb, 0x0, 0xfe, 0x33, - 0xce, 0xb, 0xff, 0xfe, 0x9e, 0xe, 0x6a, 0x0, 0xfe, 0x9, 0x82, 0xc, - 0xff, 0xfe, 0xac, 0x18, 0x4, 0x0, 0xfe, 0x18, 0xd1, 0xa, 0xff, 0xfe, - 0xfb, 0x87, 0xe, 0x0, 0xfe, 0x11, 0x9f, 0xb, 0xff, 0xfe, 0xc7, 0x1f, - 0x7, 0x0, 0xfe, 0x26, 0xe9, 0x1e, 0xff, 0xfe, 0xbe, 0x1b, 0x6, 0x0, - 0xfe, 0x7c, 0xf9, 0xa, 0xff, 0xfe, 0xea, 0x4b, 0xb, 0x0, 0xfe, 0x4f, - 0xe8, 0xb, 0xff, 0xfe, 0x7b, 0x9, 0x6a, 0x0, 0xfe, 0x32, 0xe7, 0xc, - 0xff, 0xfe, 0x79, 0x5, 0x4, 0x0, 0xfe, 0x36, 0xdb, 0xa, 0xff, 0xfe, - 0xf8, 0x6b, 0xe, 0x0, 0xfe, 0x20, 0xb8, 0xb, 0xff, 0xfe, 0xb6, 0x1a, - 0x8, 0x0, 0xfe, 0x67, 0xfc, 0x1d, 0xff, 0xfe, 0xe8, 0x3a, 0x6, 0x0, - 0xfe, 0xa3, 0xfc, 0xa, 0xff, 0xfe, 0xdb, 0x38, 0xb, 0x0, 0xfe, 0x68, - 0xfc, 0xa, 0xff, 0xfd, 0xfb, 0x5e, 0x4, 0x69, 0x0, 0xfe, 0xe, 0xa4, - 0xc, 0xff, 0xfe, 0xda, 0x38, 0x5, 0x0, 0xfe, 0x49, 0xe3, 0xa, 0xff, - 0xfe, 0xf3, 0x5a, 0xe, 0x0, 0xfe, 0x35, 0xd3, 0xb, 0xff, 0xfe, 0x9b, - 0x12, 0x8, 0x0, 0xfd, 0x7, 0x6a, 0xd9, 0x1c, 0xff, 0xfd, 0xfd, 0x62, - 0x5, 0x4, 0x0, 0xfd, 0x5, 0xc5, 0xfe, 0xa, 0xff, 0xfe, 0xc2, 0x14, - 0xa, 0x0, 0xfe, 0x1, 0x8a, 0xb, 0xff, 0xfd, 0xea, 0x39, 0x1, 0x68, - 0x0, 0xfd, 0x3, 0x85, 0xf7, 0xc, 0xff, 0xfe, 0x88, 0x7, 0x5, 0x0, - 0xfe, 0x52, 0xe7, 0xa, 0xff, 0xfe, 0xf3, 0x58, 0xe, 0x0, 0xfe, 0x51, - 0xe9, 0xb, 0xff, 0xfe, 0x75, 0x6, 0x9, 0x0, 0xfc, 0x4, 0x38, 0x93, - 0xda, 0x1b, 0xff, 0xfe, 0x78, 0xa, 0x4, 0x0, 0xfe, 0x25, 0xdb, 0xa, - 0xff, 0xfd, 0xfc, 0xa6, 0x1, 0xa, 0x0, 0xfe, 0x16, 0xac, 0xb, 0xff, - 0xfe, 0xd2, 0x1e, 0x68, 0x0, 0xfd, 0xb, 0x89, 0xf1, 0xc, 0xff, 0xfe, - 0xe2, 0x3f, 0x6, 0x0, 0xfe, 0x54, 0xe9, 0xa, 0xff, 0xfe, 0xf8, 0x6a, - 0xe, 0x0, 0xfe, 0x6f, 0xfc, 0xb, 0xff, 0xff, 0x4f, 0xc, 0x0, 0xfa, - 0x10, 0x32, 0x5c, 0x82, 0x97, 0xa1, 0x8, 0xa2, 0xfd, 0x9f, 0xa3, 0xd8, - 0xc, 0xff, 0xfe, 0x7c, 0xa, 0x4, 0x0, 0xfe, 0x49, 0xeb, 0xa, 0xff, - 0xfe, 0xf7, 0x89, 0xb, 0x0, 0xfe, 0x2e, 0xc8, 0xb, 0xff, 0xfe, 0xb3, - 0x15, 0x66, 0x0, 0xfc, 0x2, 0x38, 0xa2, 0xf5, 0xd, 0xff, 0xfe, 0x8b, - 0x8, 0x6, 0x0, 0xfe, 0x54, 0xe8, 0xa, 0xff, 0xfe, 0xfc, 0x9a, 0xd, - 0x0, 0xfe, 0x8, 0x8d, 0xb, 0xff, 0xfe, 0xef, 0x36, 0xf, 0x0, 0xfd, - 0xa, 0x11, 0x14, 0x8, 0x15, 0xfc, 0x14, 0x15, 0x42, 0xcb, 0xb, 0xff, - 0xfe, 0x73, 0x8, 0x4, 0x0, 0xfe, 0x6d, 0xf5, 0xa, 0xff, 0xfe, 0xf0, - 0x67, 0xb, 0x0, 0xfe, 0x3e, 0xd9, 0xb, 0xff, 0xfe, 0x90, 0xe, 0x64, - 0x0, 0xfb, 0x14, 0x4c, 0xa2, 0xdf, 0xfb, 0xd, 0xff, 0xfe, 0xd7, 0x37, - 0x7, 0x0, 0xfe, 0x50, 0xe7, 0xb, 0xff, 0xfe, 0xdf, 0x33, 0xc, 0x0, - 0xfe, 0x18, 0xab, 0xb, 0xff, 0xfe, 0xc7, 0x23, 0x1c, 0x0, 0xfe, 0x4, - 0x98, 0xa, 0xff, 0xfd, 0xfa, 0x5d, 0x2, 0x4, 0x0, 0xfe, 0x95, 0xfa, - 0xa, 0xff, 0xfe, 0xe1, 0x3c, 0xb, 0x0, 0xfe, 0x4b, 0xe7, 0xb, 0xff, - 0xfe, 0x66, 0x6, 0x5e, 0x0, 0xf7, 0x4, 0xf, 0x23, 0x3d, 0x5e, 0x8c, - 0xba, 0xe7, 0xfc, 0xf, 0xff, 0xfe, 0x7e, 0x5, 0x7, 0x0, 0xfe, 0x46, - 0xe2, 0xb, 0xff, 0xfd, 0xfd, 0xb9, 0x14, 0xb, 0x0, 0xfe, 0x2b, 0xc5, - 0xb, 0xff, 0xfe, 0xa2, 0x15, 0x1c, 0x0, 0xfe, 0x12, 0xa8, 0xa, 0xff, - 0xfe, 0xec, 0x3a, 0x4, 0x0, 0xfd, 0x5, 0xb3, 0xfd, 0xa, 0xff, 0xfe, - 0xd2, 0x15, 0xb, 0x0, 0xfe, 0x5c, 0xf6, 0xa, 0xff, 0xfd, 0xf9, 0x3f, - 0x1, 0x47, 0x0, 0xfd, 0x24, 0x92, 0xb7, 0x13, 0xae, 0xf9, 0xb1, 0xb6, - 0xbd, 0xcb, 0xde, 0xec, 0xf7, 0x11, 0xff, 0xfe, 0xb6, 0x1c, 0x8, 0x0, - 0xfe, 0x29, 0xd8, 0xc, 0xff, 0xfc, 0xfa, 0xb5, 0x3f, 0x2, 0x9, 0x0, - 0xfe, 0x38, 0xdc, 0xb, 0xff, 0xfe, 0x81, 0x9, 0x1c, 0x0, 0xfe, 0x3f, - 0xe1, 0xa, 0xff, 0xfe, 0xcc, 0x24, 0x4, 0x0, 0xfe, 0x1e, 0xcd, 0xb, - 0xff, 0xfe, 0xba, 0x1, 0xa, 0x0, 0xfd, 0x1, 0x7b, 0xfe, 0xa, 0xff, - 0xfe, 0xe3, 0x25, 0x48, 0x0, 0xfd, 0x4b, 0xea, 0xff, 0x14, 0xfe, 0x16, - 0xff, 0xfe, 0xca, 0x2f, 0x9, 0x0, 0xfe, 0x4, 0xba, 0xd, 0xff, 0xf9, - 0xfd, 0xe4, 0xca, 0xa9, 0x84, 0x72, 0x6e, 0x3, 0x6f, 0xfc, 0x6d, 0x6b, - 0xa1, 0xf8, 0xb, 0xff, 0xfe, 0x5e, 0x1, 0x6, 0x0, 0xfd, 0x2c, 0x71, - 0x6f, 0x10, 0x6d, 0xfb, 0x6c, 0x6d, 0x94, 0xda, 0xfd, 0xa, 0xff, 0xfe, - 0xa3, 0x15, 0x4, 0x0, 0xfe, 0x3e, 0xea, 0xa, 0xff, 0xfe, 0xf9, 0x93, - 0xb, 0x0, 0xfe, 0x12, 0x9f, 0xb, 0xff, 0xfe, 0xbb, 0x19, 0x48, 0x0, - 0xfe, 0x68, 0xf8, 0x2a, 0xff, 0xfd, 0xe7, 0x52, 0x1, 0xa, 0x0, 0xfe, - 0x7e, 0xf5, 0xf, 0xff, 0xfe, 0xfd, 0xf6, 0x5, 0xf2, 0x2, 0xf1, 0xff, - 0xf7, 0xb, 0xff, 0xfe, 0xed, 0x44, 0x7, 0x0, 0xfd, 0x7c, 0xed, 0xf2, - 0x12, 0xf1, 0xff, 0xf9, 0xc, 0xff, 0xfe, 0x6f, 0x4, 0x4, 0x0, 0xfe, - 0x5c, 0xf3, 0xa, 0xff, 0xfe, 0xf2, 0x6c, 0xb, 0x0, 0xfe, 0x23, 0xbd, - 0xb, 0xff, 0xfe, 0x99, 0x10, 0x47, 0x0, 0xfd, 0x9, 0x88, 0xfe, 0x29, - 0xff, 0xfd, 0xf4, 0x72, 0x6, 0xb, 0x0, 0xfe, 0x26, 0xe2, 0x24, 0xff, - 0xfe, 0xcf, 0x2e, 0x6, 0x0, 0xfd, 0x4, 0xa0, 0xfd, 0x1f, 0xff, 0xfe, - 0xe1, 0x31, 0x5, 0x0, 0xfe, 0x73, 0xf6, 0xa, 0xff, 0xfe, 0xec, 0x43, - 0xb, 0x0, 0xfe, 0x38, 0xd4, 0xb, 0xff, 0xfe, 0x81, 0xb, 0x47, 0x0, - 0xfe, 0x17, 0xa9, 0x29, 0xff, 0xfd, 0xe3, 0x5c, 0x9, 0xc, 0x0, 0xfd, - 0x2, 0x7e, 0xf7, 0x23, 0xff, 0xfe, 0xae, 0x1a, 0x6, 0x0, 0xfd, 0x15, - 0xc7, 0xfe, 0x1f, 0xff, 0xfe, 0x70, 0x4, 0x5, 0x0, 0xfe, 0x86, 0xf8, - 0xa, 0xff, 0xfe, 0xde, 0x19, 0xb, 0x0, 0xfe, 0x51, 0xea, 0xb, 0xff, - 0xfe, 0x6a, 0x5, 0x47, 0x0, 0xfe, 0x2a, 0xc7, 0x28, 0xff, 0xfd, 0xd8, - 0x44, 0x5, 0xe, 0x0, 0xfd, 0xf, 0xb7, 0xfd, 0x22, 0xff, 0xfe, 0x8d, - 0xc, 0x6, 0x0, 0xfe, 0x29, 0xe9, 0x1f, 0xff, 0xfe, 0xac, 0x1a, 0x5, - 0x0, 0xfd, 0x3, 0xa1, 0xfb, 0x9, 0xff, 0xfd, 0xfe, 0xc1, 0x1, 0xa, - 0x0, 0xfd, 0x1, 0x72, 0xfa, 0xb, 0xff, 0xff, 0x49, 0x48, 0x0, 0xfe, - 0x40, 0xdd, 0x27, 0xff, 0xfd, 0xae, 0x2e, 0x2, 0x10, 0x0, 0xfe, 0x41, - 0xe7, 0x22, 0xff, 0xfe, 0x71, 0x5, 0x6, 0x0, 0xfe, 0x48, 0xf2, 0x1e, - 0xff, 0xfd, 0xd3, 0x36, 0x1, 0x5, 0x0, 0xfd, 0x11, 0xc2, 0xfe, 0x9, - 0xff, 0xfe, 0xfa, 0x9c, 0xb, 0x0, 0xfe, 0xb, 0x92, 0xb, 0xff, 0xfe, - 0xec, 0x2c, 0x48, 0x0, 0xfe, 0x60, 0xf5, 0x24, 0xff, 0xfb, 0xfd, 0xc8, - 0x65, 0xa, 0x1, 0x11, 0x0, 0xfd, 0x3, 0x4c, 0xcd, 0x20, 0xff, 0xfe, - 0xf1, 0x53, 0x7, 0x0, 0xfe, 0x66, 0xf5, 0x1d, 0xff, 0xfd, 0xe0, 0x52, - 0x2, 0x6, 0x0, 0xfe, 0x26, 0xe1, 0xa, 0xff, 0xfe, 0xf4, 0x71, 0xb, - 0x0, 0xfe, 0x19, 0xae, 0xb, 0xff, 0xfe, 0xc7, 0x1e, 0x47, 0x0, 0xfe, - 0x4, 0x81, 0x23, 0xff, 0xfb, 0xf9, 0xb7, 0x59, 0x14, 0x4, 0x14, 0x0, - 0xfc, 0x2, 0x1a, 0x92, 0xf9, 0x1e, 0xff, 0xfe, 0xd8, 0x32, 0x7, 0x0, - 0xfe, 0x7d, 0xf7, 0x1c, 0xff, 0xfd, 0xb4, 0x2d, 0x3, 0x7, 0x0, 0xfe, - 0x48, 0xee, 0xa, 0xff, 0xfe, 0xee, 0x4c, 0xb, 0x0, 0xfe, 0x2f, 0xca, - 0xb, 0xff, 0xfe, 0x9c, 0x12, 0x47, 0x0, 0xfe, 0x11, 0xa0, 0x20, 0xff, - 0xfa, 0xfd, 0xd6, 0x8f, 0x4b, 0x14, 0x2, 0x18, 0x0, 0xfc, 0x5, 0x46, - 0xa0, 0xef, 0x1c, 0xff, 0xfe, 0xc3, 0x24, 0x7, 0x0, 0xfe, 0x9a, 0xfa, - 0x1a, 0xff, 0xfc, 0xdc, 0x70, 0x15, 0x1, 0x8, 0x0, 0xfe, 0x6f, 0xf4, - 0xa, 0xff, 0xfe, 0xec, 0x3a, 0xb, 0x0, 0xfe, 0x49, 0xe2, 0xb, 0xff, - 0xfe, 0x78, 0x7, 0x47, 0x0, 0xfc, 0x1e, 0xae, 0xf6, 0xe4, 0x14, 0xe5, - 0x2, 0xe4, 0xf4, 0xe2, 0xdf, 0xdb, 0xd3, 0xcb, 0xbc, 0x99, 0x6a, 0x3d, - 0x15, 0x6, 0x1, 0x1b, 0x0, 0xf6, 0x1, 0x9, 0x2b, 0x66, 0x9f, 0xc6, - 0xd5, 0xe0, 0xe5, 0xe6, 0x13, 0xe7, 0xfc, 0xe8, 0xf6, 0xa0, 0x17, 0x6, - 0x0, 0xfc, 0x3, 0xaa, 0xe9, 0xe8, 0x14, 0xe7, 0xf9, 0xe4, 0xdd, 0xd1, - 0xa7, 0x57, 0x18, 0x3, 0xa, 0x0, 0xff, 0x84, 0x2, 0xe8, 0x8, 0xe7, - 0xfd, 0xea, 0xd1, 0x23, 0xb, 0x0, 0xfc, 0x5c, 0xe4, 0xf0, 0xe6, 0x7, - 0xe7, 0xfd, 0xe9, 0xf0, 0x4e, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, - 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, - 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x2e, 0x0}; -static const Image dash_logo_image = {256, 64, 2863, dash_logo_data}; - -const VariantAnimation dash_logo = { - 21, - { - {0, 0, 25, 0, &dash_logo_image}, {0, 0, 25, 5, &dash_logo_image}, - {0, 0, 25, 10, &dash_logo_image}, {0, 0, 25, 15, &dash_logo_image}, - {0, 0, 25, 20, &dash_logo_image}, {0, 0, 25, 25, &dash_logo_image}, - {0, 0, 25, 30, &dash_logo_image}, {0, 0, 25, 35, &dash_logo_image}, - {0, 0, 25, 40, &dash_logo_image}, {0, 0, 25, 45, &dash_logo_image}, - {0, 0, 25, 50, &dash_logo_image}, {0, 0, 25, 55, &dash_logo_image}, - {0, 0, 25, 60, &dash_logo_image}, {0, 0, 25, 65, &dash_logo_image}, - {0, 0, 25, 70, &dash_logo_image}, {0, 0, 25, 75, &dash_logo_image}, - {0, 0, 25, 80, &dash_logo_image}, {0, 0, 25, 85, &dash_logo_image}, - {0, 0, 25, 90, &dash_logo_image}, {0, 0, 25, 95, &dash_logo_image}, - {0, 0, 25, 100, &dash_logo_image}, - }}; -const VariantAnimation dash_logo_reversed = { - 21, - { - {0, 0, 25, 100, &dash_logo_image}, {0, 0, 25, 95, &dash_logo_image}, - {0, 0, 25, 90, &dash_logo_image}, {0, 0, 25, 85, &dash_logo_image}, - {0, 0, 25, 80, &dash_logo_image}, {0, 0, 25, 75, &dash_logo_image}, - {0, 0, 25, 70, &dash_logo_image}, {0, 0, 25, 65, &dash_logo_image}, - {0, 0, 25, 60, &dash_logo_image}, {0, 0, 25, 55, &dash_logo_image}, - {0, 0, 25, 50, &dash_logo_image}, {0, 0, 25, 45, &dash_logo_image}, - {0, 0, 25, 40, &dash_logo_image}, {0, 0, 25, 35, &dash_logo_image}, - {0, 0, 25, 30, &dash_logo_image}, {0, 0, 25, 25, &dash_logo_image}, - {0, 0, 25, 20, &dash_logo_image}, {0, 0, 25, 15, &dash_logo_image}, - {0, 0, 25, 10, &dash_logo_image}, {0, 0, 25, 5, &dash_logo_image}, - {0, 0, 25, 0, &dash_logo_image}, - }}; - -const uint8_t dash_screensaver_data[2837] = { - 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, - 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x46, 0x0, 0xfd, 0x27, 0xba, 0xf1, - 0x16, 0xe6, 0xf5, 0xe3, 0xde, 0xd4, 0xc7, 0xad, 0x8a, 0x64, 0x39, 0x18, - 0x9, 0x1, 0x6c, 0x0, 0xfd, 0x5, 0x96, 0xed, 0x8, 0xe6, 0xfc, 0xe7, - 0xf2, 0xb7, 0x1f, 0x28, 0x0, 0xfe, 0x49, 0xe0, 0x1e, 0xff, 0xfa, 0xfb, - 0xd9, 0x9e, 0x58, 0x1b, 0x4, 0x6a, 0x0, 0xfe, 0x8, 0xcc, 0xb, 0xff, - 0xfe, 0xbd, 0x18, 0x28, 0x0, 0xfe, 0x67, 0xf3, 0x21, 0xff, 0xfb, 0xfd, - 0xd2, 0x7d, 0x23, 0x5, 0x68, 0x0, 0xfe, 0x1b, 0xec, 0xa, 0xff, 0xfd, - 0xfe, 0x9d, 0x8, 0x28, 0x0, 0xff, 0x8c, 0x25, 0xff, 0xfc, 0xdf, 0x7c, - 0x19, 0x1, 0x65, 0x0, 0xfd, 0x1, 0x46, 0xfd, 0xa, 0xff, 0xfe, 0xf4, - 0x78, 0x28, 0x0, 0xfe, 0xa, 0xaa, 0x27, 0xff, 0xfe, 0xb1, 0x25, 0x65, - 0x0, 0xfe, 0x2, 0x6f, 0xb, 0xff, 0xfe, 0xe9, 0x5b, 0x28, 0x0, 0xfe, - 0x23, 0xc1, 0x28, 0xff, 0xfd, 0xb1, 0x23, 0x1, 0x63, 0x0, 0xfe, 0x3, - 0x98, 0xb, 0xff, 0xfe, 0xda, 0x3e, 0x28, 0x0, 0xfe, 0x37, 0xd1, 0x29, - 0xff, 0xfe, 0xae, 0x20, 0x63, 0x0, 0xfe, 0x6, 0xc2, 0xb, 0xff, 0xfe, - 0xc1, 0x20, 0x28, 0x0, 0xfe, 0x47, 0xde, 0x2a, 0xff, 0xfe, 0x8e, 0x9, - 0x62, 0x0, 0xfe, 0x1c, 0xe0, 0xb, 0xff, 0xfe, 0xa3, 0x5, 0x28, 0x0, - 0xfe, 0x5e, 0xf0, 0x2a, 0xff, 0xfe, 0xd7, 0x37, 0x62, 0x0, 0xfe, 0x3f, - 0xed, 0xa, 0xff, 0xfe, 0xfb, 0x89, 0x28, 0x0, 0xfe, 0x1, 0x83, 0x2c, - 0xff, 0xfe, 0x84, 0x7, 0x61, 0x0, 0xfe, 0x66, 0xf9, 0xa, 0xff, 0xfe, - 0xef, 0x69, 0x28, 0x0, 0xfc, 0x8, 0x78, 0xc6, 0xc4, 0x4, 0xc2, 0x6, - 0xc3, 0x7, 0xc4, 0x2, 0xc5, 0xfa, 0xc9, 0xd0, 0xda, 0xe8, 0xf0, 0xfa, - 0x11, 0xff, 0xfe, 0xd8, 0x31, 0x60, 0x0, 0xfe, 0x1, 0x83, 0xb, 0xff, - 0xfe, 0xdf, 0x46, 0x28, 0x0, 0xfc, 0x3, 0x10, 0x17, 0x16, 0x3, 0x15, - 0xff, 0x16, 0x7, 0x17, 0x6, 0x18, 0x2, 0x1a, 0xf8, 0x20, 0x28, 0x37, - 0x4e, 0x6d, 0x99, 0xcb, 0xec, 0x10, 0xff, 0xfe, 0x63, 0x1, 0x60, 0x0, - 0xff, 0x93, 0xb, 0xff, 0xfe, 0xcb, 0x24, 0x45, 0x0, 0xfc, 0x22, 0x5d, - 0xb9, 0xf0, 0xe, 0xff, 0xfe, 0x9a, 0x11, 0x5f, 0x0, 0xfe, 0x3, 0xae, - 0xb, 0xff, 0xff, 0xae, 0x48, 0x0, 0xfd, 0xf, 0x75, 0xea, 0xd, 0xff, - 0xfe, 0xcb, 0x28, 0x13, 0x0, 0xfa, 0x6, 0x14, 0x20, 0x28, 0x2f, 0x35, - 0x14, 0x39, 0xfd, 0x3a, 0x3b, 0x11, 0xd, 0x0, 0xfb, 0x6, 0x19, 0x25, - 0x2e, 0x35, 0x14, 0x37, 0xfd, 0x3e, 0x21, 0x3, 0x6, 0x0, 0xfe, 0x17, - 0xcb, 0xb, 0xff, 0xfd, 0xac, 0x2f, 0x37, 0x7, 0x39, 0xfa, 0x38, 0x32, - 0x2c, 0x26, 0x1b, 0xc, 0x3b, 0x0, 0xfe, 0x6d, 0xf2, 0xc, 0xff, 0xfe, - 0xe9, 0x36, 0x10, 0x0, 0xf7, 0xa, 0x26, 0x4b, 0x76, 0xa0, 0xc3, 0xdb, - 0xeb, 0xf3, 0x14, 0xf6, 0xfc, 0xfa, 0xf5, 0x42, 0x1, 0xa, 0x0, 0xf9, - 0x12, 0x3d, 0x76, 0xad, 0xd1, 0xea, 0xf4, 0x13, 0xf5, 0xfc, 0xf4, 0xff, - 0x81, 0xa, 0x6, 0x0, 0xfe, 0x34, 0xe3, 0xa, 0xff, 0xfd, 0xfe, 0xf7, - 0xf2, 0x8, 0xf6, 0xf7, 0xf5, 0xf1, 0xe6, 0xd5, 0xb5, 0x88, 0x5a, 0x29, - 0x7, 0x38, 0x0, 0xfe, 0x10, 0xa8, 0xc, 0xff, 0xfe, 0xfa, 0x45, 0xe, - 0x0, 0xfc, 0x1b, 0x45, 0x84, 0xc6, 0x1c, 0xff, 0xfe, 0xe2, 0x30, 0x9, - 0x0, 0xfc, 0xb, 0x43, 0x99, 0xe8, 0x1a, 0xff, 0xfe, 0x66, 0x5, 0x6, - 0x0, 0xfe, 0x51, 0xf8, 0x1c, 0xff, 0xfc, 0xcd, 0x76, 0x2d, 0x2, 0x37, - 0x0, 0xfe, 0x5d, 0xf5, 0xc, 0xff, 0xff, 0x59, 0xc, 0x0, 0xfc, 0x15, - 0x59, 0xad, 0xe7, 0x1e, 0xff, 0xfe, 0xb4, 0x18, 0x8, 0x0, 0xfd, 0x1d, - 0x84, 0xe5, 0x1b, 0xff, 0xfe, 0xf7, 0x40, 0x7, 0x0, 0xff, 0x77, 0x1f, - 0xff, 0xfd, 0xd1, 0x5a, 0x4, 0x36, 0x0, 0xfe, 0x29, 0xcb, 0xc, 0xff, - 0xff, 0x61, 0xb, 0x0, 0xfd, 0x27, 0x9c, 0xf5, 0x20, 0xff, 0xfe, 0x9e, - 0xf, 0x7, 0x0, 0xfe, 0x19, 0xa9, 0x1d, 0xff, 0xfe, 0xd1, 0x2a, 0x6, - 0x0, 0xfd, 0x3, 0x9c, 0xfe, 0x1f, 0xff, 0xfd, 0xec, 0x50, 0x1, 0x35, - 0x0, 0xfe, 0x1a, 0xad, 0xc, 0xff, 0xff, 0x61, 0xa, 0x0, 0xfe, 0x36, - 0xc1, 0x22, 0xff, 0xfe, 0x8d, 0xd, 0x6, 0x0, 0xfe, 0x7, 0x92, 0x1e, - 0xff, 0xfe, 0xaf, 0x18, 0x6, 0x0, 0xfd, 0x12, 0xbb, 0xfe, 0x20, 0xff, - 0xfd, 0xd6, 0x2b, 0x1, 0x34, 0x0, 0xfe, 0x11, 0x9a, 0xc, 0xff, 0xff, - 0x5f, 0x9, 0x0, 0xfe, 0x55, 0xd6, 0x23, 0xff, 0xfe, 0x73, 0x8, 0x6, - 0x0, 0xfe, 0x65, 0xf7, 0x1e, 0xff, 0xfe, 0x8a, 0xc, 0x6, 0x0, 0xfe, - 0x26, 0xde, 0x22, 0xff, 0xfe, 0x8b, 0xb, 0x7, 0x0, 0xfc, 0x11, 0x35, - 0x57, 0x65, 0x16, 0x68, 0xfd, 0x6e, 0x4b, 0x7, 0x10, 0x0, 0xfe, 0xf, - 0x92, 0xc, 0xff, 0xff, 0x56, 0x8, 0x0, 0xfe, 0x43, 0xec, 0x23, 0xff, - 0xfd, 0xfa, 0x55, 0x3, 0x5, 0x0, 0xfe, 0x24, 0xe6, 0x1f, 0xff, 0xfe, - 0x67, 0x4, 0x6, 0x0, 0xfe, 0x3f, 0xf8, 0x22, 0xff, 0xfd, 0xdc, 0x2b, - 0x1, 0x5, 0x0, 0xfb, 0x40, 0x9a, 0xd2, 0xef, 0xf9, 0x16, 0xfb, 0xfd, - 0xff, 0xa8, 0xd, 0x10, 0x0, 0xfe, 0x10, 0x96, 0xb, 0xff, 0xfe, 0xfc, - 0x48, 0x7, 0x0, 0xfe, 0x21, 0xcd, 0x24, 0xff, 0xfe, 0xe3, 0x38, 0x6, - 0x0, 0xff, 0x8e, 0x1f, 0xff, 0xfd, 0xfa, 0x4d, 0x1, 0x6, 0x0, 0xfe, - 0x61, 0xfc, 0x22, 0xff, 0xfd, 0xfc, 0x50, 0x3, 0x3, 0x0, 0xfd, 0x2, - 0x54, 0xda, 0x1b, 0xff, 0xfe, 0x89, 0x7, 0x10, 0x0, 0xfe, 0x16, 0xa5, - 0xb, 0xff, 0xfe, 0xee, 0x39, 0x6, 0x0, 0xfe, 0x13, 0xa9, 0x11, 0xff, - 0xfd, 0xf3, 0xe8, 0xe6, 0x3, 0xe7, 0xfd, 0xe3, 0xea, 0xfa, 0xb, 0xff, - 0xfe, 0xc8, 0x1f, 0x5, 0x0, 0xfe, 0x20, 0xe8, 0xc, 0xff, 0xfe, 0xed, - 0xe5, 0xf, 0xe7, 0xfc, 0xe6, 0xee, 0xc4, 0x2c, 0x6, 0x0, 0xfd, 0x1, - 0x8b, 0xfc, 0x23, 0xff, 0xfe, 0x5e, 0x3, 0x2, 0x0, 0xfd, 0x1, 0x31, - 0xdf, 0x1c, 0xff, 0xfe, 0x53, 0x3, 0x10, 0x0, 0xfe, 0x22, 0xbc, 0xb, - 0xff, 0xfe, 0xd9, 0x2e, 0x6, 0x0, 0xfe, 0x79, 0xfe, 0xd, 0xff, 0xf9, - 0xf9, 0xcd, 0x9f, 0x79, 0x63, 0x55, 0x52, 0x3, 0x53, 0xfd, 0x4d, 0x7a, - 0xe6, 0xb, 0xff, 0xfe, 0xa5, 0x11, 0x5, 0x0, 0xfe, 0x65, 0xfd, 0xa, - 0xff, 0xfc, 0xec, 0x92, 0x59, 0x51, 0xf, 0x53, 0xfc, 0x52, 0x5c, 0x40, - 0x8, 0x6, 0x0, 0xfd, 0x8, 0xb7, 0xfd, 0xa, 0xff, 0xfc, 0xe3, 0x90, - 0x86, 0x8d, 0x2, 0x8c, 0xfb, 0x8b, 0x8e, 0x9c, 0xb9, 0xec, 0xe, 0xff, - 0xfe, 0x61, 0x5, 0x2, 0x0, 0xfe, 0xa, 0x8c, 0x1c, 0xff, 0xfd, 0xec, - 0x31, 0x1, 0x10, 0x0, 0xfe, 0x31, 0xd3, 0xb, 0xff, 0xfe, 0xc0, 0x23, - 0x5, 0x0, 0xfe, 0x25, 0xd9, 0xd, 0xff, 0xfc, 0xc8, 0x6a, 0x32, 0x2, - 0x8, 0x0, 0xfe, 0x41, 0xea, 0xb, 0xff, 0xfe, 0x85, 0xc, 0x5, 0x0, - 0xfe, 0x8e, 0xfc, 0x9, 0xff, 0xfe, 0xf7, 0x8f, 0x1c, 0x0, 0xfe, 0x12, - 0xdc, 0xa, 0xff, 0xfe, 0xfd, 0xa9, 0x8, 0x0, 0xfd, 0x1b, 0x5c, 0xd1, - 0xd, 0xff, 0xfe, 0x63, 0x5, 0x2, 0x0, 0xfe, 0x24, 0xd8, 0x1c, 0xff, - 0xfe, 0xbb, 0x16, 0x11, 0x0, 0xfe, 0x4e, 0xed, 0xb, 0xff, 0xfe, 0xa1, - 0x14, 0x5, 0x0, 0xfe, 0x75, 0xf8, 0xb, 0xff, 0xfd, 0xf6, 0x98, 0x2f, - 0xb, 0x0, 0xfe, 0x6c, 0xfe, 0xa, 0xff, 0xfd, 0xfc, 0x63, 0x5, 0x5, - 0x0, 0xfe, 0xb4, 0xfe, 0x9, 0xff, 0xfe, 0xe0, 0x3e, 0x1c, 0x0, 0xfe, - 0x2f, 0xf3, 0xa, 0xff, 0xfe, 0xf5, 0x83, 0xa, 0x0, 0xfe, 0x48, 0xdd, - 0xc, 0xff, 0xfa, 0x63, 0x5, 0x0, 0x3, 0x53, 0xfa, 0x1c, 0xff, 0xfe, - 0x82, 0x6, 0x10, 0x0, 0xfe, 0x3, 0x75, 0xc, 0xff, 0xfe, 0x7c, 0x4, - 0x4, 0x0, 0xfd, 0x11, 0xc7, 0xfe, 0xa, 0xff, 0xfd, 0xf5, 0x79, 0xd, - 0xb, 0x0, 0xfe, 0x7, 0x90, 0xb, 0xff, 0xfe, 0xef, 0x3b, 0x5, 0x0, - 0xfe, 0x11, 0xd3, 0xa, 0xff, 0xfe, 0xd8, 0x29, 0x1c, 0x0, 0xfe, 0x5c, - 0xfa, 0xa, 0xff, 0xfe, 0xed, 0x5d, 0xb, 0x0, 0xff, 0x8a, 0xc, 0xff, - 0xfb, 0x61, 0x4, 0x0, 0xa, 0x82, 0x1c, 0xff, 0xfd, 0xf4, 0x3c, 0x1, - 0x10, 0x0, 0xfe, 0xe, 0x96, 0xc, 0xff, 0xff, 0x59, 0x5, 0x0, 0xfe, - 0x52, 0xf1, 0xa, 0xff, 0xfd, 0xfd, 0xa9, 0x5, 0xc, 0x0, 0xfe, 0x1c, - 0xb0, 0xb, 0xff, 0xfe, 0xd8, 0x22, 0x5, 0x0, 0xfe, 0x2a, 0xdd, 0xa, - 0xff, 0xfc, 0xec, 0x6e, 0x5, 0x0, 0x9, 0x1, 0x11, 0x0, 0xfe, 0x80, - 0xfb, 0xa, 0xff, 0xfe, 0xe5, 0x3d, 0xb, 0x0, 0xfe, 0x65, 0xf8, 0xb, - 0xff, 0xfb, 0x5d, 0x4, 0x0, 0x11, 0xab, 0x1c, 0xff, 0xfe, 0x99, 0xb, - 0x11, 0x0, 0xfe, 0x18, 0xaa, 0xb, 0xff, 0xfe, 0xe7, 0x3d, 0x5, 0x0, - 0xfe, 0xa2, 0xfb, 0xa, 0xff, 0xfe, 0xed, 0x3f, 0xd, 0x0, 0xfe, 0x2d, - 0xc7, 0xb, 0xff, 0xfe, 0xba, 0x19, 0x5, 0x0, 0xfe, 0x33, 0xe1, 0xb, - 0xff, 0xfd, 0xe2, 0xa5, 0x9b, 0x8, 0x9f, 0xfa, 0x9e, 0x99, 0x89, 0x6b, - 0x3f, 0x17, 0xc, 0x0, 0xfe, 0x98, 0xfb, 0xa, 0xff, 0xfe, 0xd4, 0x23, - 0xb, 0x0, 0xfe, 0x64, 0xf4, 0xb, 0xff, 0xfb, 0x58, 0x4, 0x0, 0x2f, - 0xde, 0x1b, 0xff, 0xfe, 0xb5, 0x24, 0x12, 0x0, 0xfe, 0x2f, 0xd1, 0xb, - 0xff, 0xfe, 0xb8, 0x21, 0x4, 0x0, 0xfe, 0x1b, 0xda, 0xa, 0xff, 0xfd, - 0xfd, 0xa3, 0x5, 0xd, 0x0, 0xfe, 0x39, 0xd6, 0xb, 0xff, 0xfe, 0x91, - 0xf, 0x5, 0x0, 0xfe, 0x2e, 0xdf, 0x19, 0xff, 0xfb, 0xf8, 0xd9, 0xb9, - 0x79, 0x10, 0xa, 0x0, 0xfe, 0xb1, 0xfd, 0x9, 0xff, 0xfd, 0xfd, 0xb3, - 0xb, 0xb, 0x0, 0xfe, 0x78, 0xfc, 0xa, 0xff, 0xfe, 0xf7, 0x49, 0x2, - 0x2, 0xff, 0x58, 0x19, 0xff, 0xfc, 0xf4, 0xce, 0x89, 0x25, 0x13, 0x0, - 0xfe, 0x56, 0xf9, 0xb, 0xff, 0xfe, 0x89, 0x8, 0x4, 0x0, 0xfe, 0x58, - 0xee, 0xa, 0xff, 0xfe, 0xf2, 0x4f, 0xe, 0x0, 0xfe, 0x44, 0xe5, 0xb, - 0xff, 0xfe, 0x69, 0x5, 0x5, 0x0, 0xfe, 0x15, 0xd7, 0x1c, 0xff, 0xfd, - 0xf8, 0xa4, 0x1e, 0x8, 0x0, 0xfe, 0x6, 0xd3, 0xa, 0xff, 0xfe, 0xf8, - 0x92, 0xb, 0x0, 0xfe, 0x2, 0x97, 0xb, 0xff, 0xf9, 0xdd, 0x32, 0x0, - 0x2, 0x31, 0x8a, 0x80, 0x16, 0x7f, 0xfc, 0x78, 0x5d, 0x31, 0x9, 0x13, - 0x0, 0xfe, 0xb, 0x8e, 0xb, 0xff, 0xfe, 0xf5, 0x5b, 0x5, 0x0, 0xfe, - 0x8d, 0xf8, 0xa, 0xff, 0xfe, 0xd3, 0x20, 0xe, 0x0, 0xfe, 0x5b, 0xf4, - 0xa, 0xff, 0xfe, 0xfe, 0x44, 0x6, 0x0, 0xfd, 0x2, 0xb9, 0xfe, 0x1d, - 0xff, 0xfe, 0xa8, 0x16, 0x7, 0x0, 0xfe, 0x23, 0xeb, 0xa, 0xff, 0xfe, - 0xf2, 0x76, 0xb, 0x0, 0xfe, 0x14, 0xb3, 0xb, 0xff, 0xfe, 0xc1, 0x1b, - 0x2, 0x0, 0xfe, 0x2, 0x5, 0x17, 0x4, 0xff, 0x3, 0x16, 0x0, 0xfe, - 0x32, 0xe4, 0xb, 0xff, 0xfe, 0xcf, 0x30, 0x5, 0x0, 0xff, 0xb9, 0xa, - 0xff, 0xfd, 0xfd, 0xab, 0x4, 0xd, 0x0, 0xfd, 0x5, 0x7e, 0xfd, 0xa, - 0xff, 0xfe, 0xe4, 0x29, 0x7, 0x0, 0xff, 0x7e, 0x1e, 0xff, 0xfd, 0xfd, - 0x70, 0x9, 0x6, 0x0, 0xfe, 0x50, 0xf4, 0xa, 0xff, 0xfe, 0xed, 0x5c, - 0xb, 0x0, 0xfe, 0x33, 0xce, 0xb, 0xff, 0xfe, 0x9e, 0xe, 0x31, 0x0, - 0xfe, 0x9, 0x82, 0xc, 0xff, 0xfe, 0xac, 0x18, 0x4, 0x0, 0xfe, 0x18, - 0xd1, 0xa, 0xff, 0xfe, 0xfb, 0x87, 0xe, 0x0, 0xfe, 0x11, 0x9f, 0xb, - 0xff, 0xfe, 0xc7, 0x1f, 0x7, 0x0, 0xfe, 0x26, 0xe9, 0x1e, 0xff, 0xfe, - 0xbe, 0x1b, 0x6, 0x0, 0xfe, 0x7c, 0xf9, 0xa, 0xff, 0xfe, 0xea, 0x4b, - 0xb, 0x0, 0xfe, 0x4f, 0xe8, 0xb, 0xff, 0xfe, 0x7b, 0x9, 0x31, 0x0, - 0xfe, 0x32, 0xe7, 0xc, 0xff, 0xfe, 0x79, 0x5, 0x4, 0x0, 0xfe, 0x36, - 0xdb, 0xa, 0xff, 0xfe, 0xf8, 0x6b, 0xe, 0x0, 0xfe, 0x20, 0xb8, 0xb, - 0xff, 0xfe, 0xb6, 0x1a, 0x8, 0x0, 0xfe, 0x67, 0xfc, 0x1d, 0xff, 0xfe, - 0xe8, 0x3a, 0x6, 0x0, 0xfe, 0xa3, 0xfc, 0xa, 0xff, 0xfe, 0xdb, 0x38, - 0xb, 0x0, 0xfe, 0x68, 0xfc, 0xa, 0xff, 0xfd, 0xfb, 0x5e, 0x4, 0x30, - 0x0, 0xfe, 0xe, 0xa4, 0xc, 0xff, 0xfe, 0xda, 0x38, 0x5, 0x0, 0xfe, - 0x49, 0xe3, 0xa, 0xff, 0xfe, 0xf3, 0x5a, 0xe, 0x0, 0xfe, 0x35, 0xd3, - 0xb, 0xff, 0xfe, 0x9b, 0x12, 0x8, 0x0, 0xfd, 0x7, 0x6a, 0xd9, 0x1c, - 0xff, 0xfd, 0xfd, 0x62, 0x5, 0x4, 0x0, 0xfd, 0x5, 0xc5, 0xfe, 0xa, - 0xff, 0xfe, 0xc2, 0x14, 0xa, 0x0, 0xfe, 0x1, 0x8a, 0xb, 0xff, 0xfd, - 0xea, 0x39, 0x1, 0x2f, 0x0, 0xfd, 0x3, 0x85, 0xf7, 0xc, 0xff, 0xfe, - 0x88, 0x7, 0x5, 0x0, 0xfe, 0x52, 0xe7, 0xa, 0xff, 0xfe, 0xf3, 0x58, - 0xe, 0x0, 0xfe, 0x51, 0xe9, 0xb, 0xff, 0xfe, 0x75, 0x6, 0x9, 0x0, - 0xfc, 0x4, 0x38, 0x93, 0xda, 0x1b, 0xff, 0xfe, 0x78, 0xa, 0x4, 0x0, - 0xfe, 0x25, 0xdb, 0xa, 0xff, 0xfd, 0xfc, 0xa6, 0x1, 0xa, 0x0, 0xfe, - 0x16, 0xac, 0xb, 0xff, 0xfe, 0xd2, 0x1e, 0x2f, 0x0, 0xfd, 0xb, 0x89, - 0xf1, 0xc, 0xff, 0xfe, 0xe2, 0x3f, 0x6, 0x0, 0xfe, 0x54, 0xe9, 0xa, - 0xff, 0xfe, 0xf8, 0x6a, 0xe, 0x0, 0xfe, 0x6f, 0xfc, 0xb, 0xff, 0xff, - 0x4f, 0xc, 0x0, 0xfa, 0x10, 0x32, 0x5c, 0x82, 0x97, 0xa1, 0x8, 0xa2, - 0xfd, 0x9f, 0xa3, 0xd8, 0xc, 0xff, 0xfe, 0x7c, 0xa, 0x4, 0x0, 0xfe, - 0x49, 0xeb, 0xa, 0xff, 0xfe, 0xf7, 0x89, 0xb, 0x0, 0xfe, 0x2e, 0xc8, - 0xb, 0xff, 0xfe, 0xb3, 0x15, 0x2d, 0x0, 0xfc, 0x2, 0x38, 0xa2, 0xf5, - 0xd, 0xff, 0xfe, 0x8b, 0x8, 0x6, 0x0, 0xfe, 0x54, 0xe8, 0xa, 0xff, - 0xfe, 0xfc, 0x9a, 0xd, 0x0, 0xfe, 0x8, 0x8d, 0xb, 0xff, 0xfe, 0xef, - 0x36, 0xf, 0x0, 0xfd, 0xa, 0x11, 0x14, 0x8, 0x15, 0xfc, 0x14, 0x15, - 0x42, 0xcb, 0xb, 0xff, 0xfe, 0x73, 0x8, 0x4, 0x0, 0xfe, 0x6d, 0xf5, - 0xa, 0xff, 0xfe, 0xf0, 0x67, 0xb, 0x0, 0xfe, 0x3e, 0xd9, 0xb, 0xff, - 0xfe, 0x90, 0xe, 0x2b, 0x0, 0xfb, 0x14, 0x4c, 0xa2, 0xdf, 0xfb, 0xd, - 0xff, 0xfe, 0xd7, 0x37, 0x7, 0x0, 0xfe, 0x50, 0xe7, 0xb, 0xff, 0xfe, - 0xdf, 0x33, 0xc, 0x0, 0xfe, 0x18, 0xab, 0xb, 0xff, 0xfe, 0xc7, 0x23, - 0x1c, 0x0, 0xfe, 0x4, 0x98, 0xa, 0xff, 0xfd, 0xfa, 0x5d, 0x2, 0x4, - 0x0, 0xfe, 0x95, 0xfa, 0xa, 0xff, 0xfe, 0xe1, 0x3c, 0xb, 0x0, 0xfe, - 0x4b, 0xe7, 0xb, 0xff, 0xfe, 0x66, 0x6, 0x25, 0x0, 0xf7, 0x4, 0xf, - 0x23, 0x3d, 0x5e, 0x8c, 0xba, 0xe7, 0xfc, 0xf, 0xff, 0xfe, 0x7e, 0x5, - 0x7, 0x0, 0xfe, 0x46, 0xe2, 0xb, 0xff, 0xfd, 0xfd, 0xb9, 0x14, 0xb, - 0x0, 0xfe, 0x2b, 0xc5, 0xb, 0xff, 0xfe, 0xa2, 0x15, 0x1c, 0x0, 0xfe, - 0x12, 0xa8, 0xa, 0xff, 0xfe, 0xec, 0x3a, 0x4, 0x0, 0xfd, 0x5, 0xb3, - 0xfd, 0xa, 0xff, 0xfe, 0xd2, 0x15, 0xb, 0x0, 0xfe, 0x5c, 0xf6, 0xa, - 0xff, 0xfd, 0xf9, 0x3f, 0x1, 0xe, 0x0, 0xfd, 0x24, 0x92, 0xb7, 0x13, - 0xae, 0xf9, 0xb1, 0xb6, 0xbd, 0xcb, 0xde, 0xec, 0xf7, 0x11, 0xff, 0xfe, - 0xb6, 0x1c, 0x8, 0x0, 0xfe, 0x29, 0xd8, 0xc, 0xff, 0xfc, 0xfa, 0xb5, - 0x3f, 0x2, 0x9, 0x0, 0xfe, 0x38, 0xdc, 0xb, 0xff, 0xfe, 0x81, 0x9, - 0x1c, 0x0, 0xfe, 0x3f, 0xe1, 0xa, 0xff, 0xfe, 0xcc, 0x24, 0x4, 0x0, - 0xfe, 0x1e, 0xcd, 0xb, 0xff, 0xfe, 0xba, 0x1, 0xa, 0x0, 0xfd, 0x1, - 0x7b, 0xfe, 0xa, 0xff, 0xfe, 0xe3, 0x25, 0xf, 0x0, 0xfd, 0x4b, 0xea, - 0xff, 0x14, 0xfe, 0x16, 0xff, 0xfe, 0xca, 0x2f, 0x9, 0x0, 0xfe, 0x4, - 0xba, 0xd, 0xff, 0xf9, 0xfd, 0xe4, 0xca, 0xa9, 0x84, 0x72, 0x6e, 0x3, - 0x6f, 0xfc, 0x6d, 0x6b, 0xa1, 0xf8, 0xb, 0xff, 0xfe, 0x5e, 0x1, 0x6, - 0x0, 0xfd, 0x2c, 0x71, 0x6f, 0x10, 0x6d, 0xfb, 0x6c, 0x6d, 0x94, 0xda, - 0xfd, 0xa, 0xff, 0xfe, 0xa3, 0x15, 0x4, 0x0, 0xfe, 0x3e, 0xea, 0xa, - 0xff, 0xfe, 0xf9, 0x93, 0xb, 0x0, 0xfe, 0x12, 0x9f, 0xb, 0xff, 0xfe, - 0xbb, 0x19, 0xf, 0x0, 0xfe, 0x68, 0xf8, 0x2a, 0xff, 0xfd, 0xe7, 0x52, - 0x1, 0xa, 0x0, 0xfe, 0x7e, 0xf5, 0xf, 0xff, 0xfe, 0xfd, 0xf6, 0x5, - 0xf2, 0x2, 0xf1, 0xff, 0xf7, 0xb, 0xff, 0xfe, 0xed, 0x44, 0x7, 0x0, - 0xfd, 0x7c, 0xed, 0xf2, 0x12, 0xf1, 0xff, 0xf9, 0xc, 0xff, 0xfe, 0x6f, - 0x4, 0x4, 0x0, 0xfe, 0x5c, 0xf3, 0xa, 0xff, 0xfe, 0xf2, 0x6c, 0xb, - 0x0, 0xfe, 0x23, 0xbd, 0xb, 0xff, 0xfe, 0x99, 0x10, 0xe, 0x0, 0xfd, - 0x9, 0x88, 0xfe, 0x29, 0xff, 0xfd, 0xf4, 0x72, 0x6, 0xb, 0x0, 0xfe, - 0x26, 0xe2, 0x24, 0xff, 0xfe, 0xcf, 0x2e, 0x6, 0x0, 0xfd, 0x4, 0xa0, - 0xfd, 0x1f, 0xff, 0xfe, 0xe1, 0x31, 0x5, 0x0, 0xfe, 0x73, 0xf6, 0xa, - 0xff, 0xfe, 0xec, 0x43, 0xb, 0x0, 0xfe, 0x38, 0xd4, 0xb, 0xff, 0xfe, - 0x81, 0xb, 0xe, 0x0, 0xfe, 0x17, 0xa9, 0x29, 0xff, 0xfd, 0xe3, 0x5c, - 0x9, 0xc, 0x0, 0xfd, 0x2, 0x7e, 0xf7, 0x23, 0xff, 0xfe, 0xae, 0x1a, - 0x6, 0x0, 0xfd, 0x15, 0xc7, 0xfe, 0x1f, 0xff, 0xfe, 0x70, 0x4, 0x5, - 0x0, 0xfe, 0x86, 0xf8, 0xa, 0xff, 0xfe, 0xde, 0x19, 0xb, 0x0, 0xfe, - 0x51, 0xea, 0xb, 0xff, 0xfe, 0x6a, 0x5, 0xe, 0x0, 0xfe, 0x2a, 0xc7, - 0x28, 0xff, 0xfd, 0xd8, 0x44, 0x5, 0xe, 0x0, 0xfd, 0xf, 0xb7, 0xfd, - 0x22, 0xff, 0xfe, 0x8d, 0xc, 0x6, 0x0, 0xfe, 0x29, 0xe9, 0x1f, 0xff, - 0xfe, 0xac, 0x1a, 0x5, 0x0, 0xfd, 0x3, 0xa1, 0xfb, 0x9, 0xff, 0xfd, - 0xfe, 0xc1, 0x1, 0xa, 0x0, 0xfd, 0x1, 0x72, 0xfa, 0xb, 0xff, 0xff, - 0x49, 0xf, 0x0, 0xfe, 0x40, 0xdd, 0x27, 0xff, 0xfd, 0xae, 0x2e, 0x2, - 0x10, 0x0, 0xfe, 0x41, 0xe7, 0x22, 0xff, 0xfe, 0x71, 0x5, 0x6, 0x0, - 0xfe, 0x48, 0xf2, 0x1e, 0xff, 0xfd, 0xd3, 0x36, 0x1, 0x5, 0x0, 0xfd, - 0x11, 0xc2, 0xfe, 0x9, 0xff, 0xfe, 0xfa, 0x9c, 0xb, 0x0, 0xfe, 0xb, - 0x92, 0xb, 0xff, 0xfe, 0xec, 0x2c, 0xf, 0x0, 0xfe, 0x60, 0xf5, 0x24, - 0xff, 0xfb, 0xfd, 0xc8, 0x65, 0xa, 0x1, 0x11, 0x0, 0xfd, 0x3, 0x4c, - 0xcd, 0x20, 0xff, 0xfe, 0xf1, 0x53, 0x7, 0x0, 0xfe, 0x66, 0xf5, 0x1d, - 0xff, 0xfd, 0xe0, 0x52, 0x2, 0x6, 0x0, 0xfe, 0x26, 0xe1, 0xa, 0xff, - 0xfe, 0xf4, 0x71, 0xb, 0x0, 0xfe, 0x19, 0xae, 0xb, 0xff, 0xfe, 0xc7, - 0x1e, 0xe, 0x0, 0xfe, 0x4, 0x81, 0x23, 0xff, 0xfb, 0xf9, 0xb7, 0x59, - 0x14, 0x4, 0x14, 0x0, 0xfc, 0x2, 0x1a, 0x92, 0xf9, 0x1e, 0xff, 0xfe, - 0xd8, 0x32, 0x7, 0x0, 0xfe, 0x7d, 0xf7, 0x1c, 0xff, 0xfd, 0xb4, 0x2d, - 0x3, 0x7, 0x0, 0xfe, 0x48, 0xee, 0xa, 0xff, 0xfe, 0xee, 0x4c, 0xb, - 0x0, 0xfe, 0x2f, 0xca, 0xb, 0xff, 0xfe, 0x9c, 0x12, 0xe, 0x0, 0xfe, - 0x11, 0xa0, 0x20, 0xff, 0xfa, 0xfd, 0xd6, 0x8f, 0x4b, 0x14, 0x2, 0x18, - 0x0, 0xfc, 0x5, 0x46, 0xa0, 0xef, 0x1c, 0xff, 0xfe, 0xc3, 0x24, 0x7, - 0x0, 0xfe, 0x9a, 0xfa, 0x1a, 0xff, 0xfc, 0xdc, 0x70, 0x15, 0x1, 0x8, - 0x0, 0xfe, 0x6f, 0xf4, 0xa, 0xff, 0xfe, 0xec, 0x3a, 0xb, 0x0, 0xfe, - 0x49, 0xe2, 0xb, 0xff, 0xfe, 0x78, 0x7, 0xe, 0x0, 0xfc, 0x1e, 0xae, - 0xf6, 0xe4, 0x14, 0xe5, 0x2, 0xe4, 0xf4, 0xe2, 0xdf, 0xdb, 0xd3, 0xcb, - 0xbc, 0x99, 0x6a, 0x3d, 0x15, 0x6, 0x1, 0x1b, 0x0, 0xf6, 0x1, 0x9, - 0x2b, 0x66, 0x9f, 0xc6, 0xd5, 0xe0, 0xe5, 0xe6, 0x13, 0xe7, 0xfc, 0xe8, - 0xf6, 0xa0, 0x17, 0x6, 0x0, 0xfc, 0x3, 0xaa, 0xe9, 0xe8, 0x14, 0xe7, - 0xf9, 0xe4, 0xdd, 0xd1, 0xa7, 0x57, 0x18, 0x3, 0xa, 0x0, 0xff, 0x84, - 0x2, 0xe8, 0x8, 0xe7, 0xfd, 0xea, 0xd1, 0x23, 0xb, 0x0, 0xfc, 0x5c, - 0xe4, 0xf0, 0xe6, 0x7, 0xe7, 0xfd, 0xe9, 0xf0, 0x4e, 0x7f, 0x0, 0x7f, - 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, - 0x0, 0x7f, 0x0, 0x38, 0x0}; -static const Image dash_screensaver_image = {199, 64, 2837, - dash_screensaver_data}; - -const VariantAnimation dash_screensaver = { - 114, - { - {29, 0, 125, 100, &dash_screensaver_image}, - {30, 0, 125, 100, &dash_screensaver_image}, - {31, 0, 125, 100, &dash_screensaver_image}, - {32, 0, 125, 100, &dash_screensaver_image}, - {33, 0, 125, 100, &dash_screensaver_image}, - {34, 0, 125, 100, &dash_screensaver_image}, - {35, 0, 125, 100, &dash_screensaver_image}, - {36, 0, 125, 100, &dash_screensaver_image}, - {37, 0, 125, 100, &dash_screensaver_image}, - {38, 0, 125, 100, &dash_screensaver_image}, - {39, 0, 125, 100, &dash_screensaver_image}, - {40, 0, 125, 100, &dash_screensaver_image}, - {41, 0, 125, 100, &dash_screensaver_image}, - {42, 0, 125, 100, &dash_screensaver_image}, - {43, 0, 125, 100, &dash_screensaver_image}, - {44, 0, 125, 100, &dash_screensaver_image}, - {45, 0, 125, 100, &dash_screensaver_image}, - {46, 0, 125, 100, &dash_screensaver_image}, - {47, 0, 125, 100, &dash_screensaver_image}, - {48, 0, 125, 100, &dash_screensaver_image}, - {49, 0, 125, 100, &dash_screensaver_image}, - {50, 0, 125, 100, &dash_screensaver_image}, - {51, 0, 125, 100, &dash_screensaver_image}, - {52, 0, 125, 100, &dash_screensaver_image}, - {53, 0, 125, 100, &dash_screensaver_image}, - {54, 0, 125, 100, &dash_screensaver_image}, - {55, 0, 125, 100, &dash_screensaver_image}, - {56, 0, 125, 100, &dash_screensaver_image}, - {55, 0, 125, 100, &dash_screensaver_image}, - {54, 0, 125, 100, &dash_screensaver_image}, - {53, 0, 125, 100, &dash_screensaver_image}, - {52, 0, 125, 100, &dash_screensaver_image}, - {51, 0, 125, 100, &dash_screensaver_image}, - {50, 0, 125, 100, &dash_screensaver_image}, - {49, 0, 125, 100, &dash_screensaver_image}, - {48, 0, 125, 100, &dash_screensaver_image}, - {47, 0, 125, 100, &dash_screensaver_image}, - {46, 0, 125, 100, &dash_screensaver_image}, - {45, 0, 125, 100, &dash_screensaver_image}, - {44, 0, 125, 100, &dash_screensaver_image}, - {43, 0, 125, 100, &dash_screensaver_image}, - {42, 0, 125, 100, &dash_screensaver_image}, - {41, 0, 125, 100, &dash_screensaver_image}, - {40, 0, 125, 100, &dash_screensaver_image}, - {39, 0, 125, 100, &dash_screensaver_image}, - {38, 0, 125, 100, &dash_screensaver_image}, - {37, 0, 125, 100, &dash_screensaver_image}, - {36, 0, 125, 100, &dash_screensaver_image}, - {35, 0, 125, 100, &dash_screensaver_image}, - {34, 0, 125, 100, &dash_screensaver_image}, - {33, 0, 125, 100, &dash_screensaver_image}, - {32, 0, 125, 100, &dash_screensaver_image}, - {31, 0, 125, 100, &dash_screensaver_image}, - {30, 0, 125, 100, &dash_screensaver_image}, - {29, 0, 125, 100, &dash_screensaver_image}, - {28, 0, 125, 100, &dash_screensaver_image}, - {27, 0, 125, 100, &dash_screensaver_image}, - {26, 0, 125, 100, &dash_screensaver_image}, - {25, 0, 125, 100, &dash_screensaver_image}, - {24, 0, 125, 100, &dash_screensaver_image}, - {23, 0, 125, 100, &dash_screensaver_image}, - {22, 0, 125, 100, &dash_screensaver_image}, - {21, 0, 125, 100, &dash_screensaver_image}, - {20, 0, 125, 100, &dash_screensaver_image}, - {19, 0, 125, 100, &dash_screensaver_image}, - {18, 0, 125, 100, &dash_screensaver_image}, - {17, 0, 125, 100, &dash_screensaver_image}, - {16, 0, 125, 100, &dash_screensaver_image}, - {15, 0, 125, 100, &dash_screensaver_image}, - {14, 0, 125, 100, &dash_screensaver_image}, - {13, 0, 125, 100, &dash_screensaver_image}, - {12, 0, 125, 100, &dash_screensaver_image}, - {11, 0, 125, 100, &dash_screensaver_image}, - {10, 0, 125, 100, &dash_screensaver_image}, - {9, 0, 125, 100, &dash_screensaver_image}, - {8, 0, 125, 100, &dash_screensaver_image}, - {7, 0, 125, 100, &dash_screensaver_image}, - {6, 0, 125, 100, &dash_screensaver_image}, - {5, 0, 125, 100, &dash_screensaver_image}, - {4, 0, 125, 100, &dash_screensaver_image}, - {3, 0, 125, 100, &dash_screensaver_image}, - {2, 0, 125, 100, &dash_screensaver_image}, - {1, 0, 125, 100, &dash_screensaver_image}, - {0, 0, 125, 100, &dash_screensaver_image}, - {0, 0, 125, 100, &dash_screensaver_image}, - {1, 0, 125, 100, &dash_screensaver_image}, - {2, 0, 125, 100, &dash_screensaver_image}, - {3, 0, 125, 100, &dash_screensaver_image}, - {4, 0, 125, 100, &dash_screensaver_image}, - {5, 0, 125, 100, &dash_screensaver_image}, - {6, 0, 125, 100, &dash_screensaver_image}, - {7, 0, 125, 100, &dash_screensaver_image}, - {8, 0, 125, 100, &dash_screensaver_image}, - {9, 0, 125, 100, &dash_screensaver_image}, - {10, 0, 125, 100, &dash_screensaver_image}, - {11, 0, 125, 100, &dash_screensaver_image}, - {12, 0, 125, 100, &dash_screensaver_image}, - {13, 0, 125, 100, &dash_screensaver_image}, - {14, 0, 125, 100, &dash_screensaver_image}, - {15, 0, 125, 100, &dash_screensaver_image}, - {16, 0, 125, 100, &dash_screensaver_image}, - {17, 0, 125, 100, &dash_screensaver_image}, - {18, 0, 125, 100, &dash_screensaver_image}, - {19, 0, 125, 100, &dash_screensaver_image}, - {20, 0, 125, 100, &dash_screensaver_image}, - {21, 0, 125, 100, &dash_screensaver_image}, - {22, 0, 125, 100, &dash_screensaver_image}, - {23, 0, 125, 100, &dash_screensaver_image}, - {24, 0, 125, 100, &dash_screensaver_image}, - {25, 0, 125, 100, &dash_screensaver_image}, - {26, 0, 125, 100, &dash_screensaver_image}, - {27, 0, 125, 100, &dash_screensaver_image}, - {28, 0, 125, 100, &dash_screensaver_image}, - {29, 0, 125, 100, &dash_screensaver_image}, - }}; - -VariantInfo dash_svi __attribute__((section("variant_info"))) = { - .version = 1, - .name = "DASH", - .logo = &dash_logo, - .logo_reversed = &dash_logo_reversed, - .screensaver_timeout = ONE_SEC * 60 * 10, - .screensaver = &dash_screensaver}; diff --git a/tools/variant/fox.c b/tools/variant/fox.c deleted file mode 100644 index 0de5bd181..000000000 --- a/tools/variant/fox.c +++ /dev/null @@ -1,787 +0,0 @@ -/* - * This file is part of the KeepKey project. - * - * Copyright (C) 2015 KeepKey LLC - * - * This library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see . - */ - -#include "keepkey/board/variant.h" - -#include "keepkey/board/timer.h" - -const uint8_t fox_logo_data[2432] = { - 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, - 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, - 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, - 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, - 0x55, 0x0, 0xfe, 0xa, 0x7, 0x10, 0x0, 0xfd, 0x1, 0xa, 0x4, 0x7f, - 0x0, 0x6b, 0x0, 0xfb, 0x1, 0x23, 0x35, 0x1c, 0x6, 0xc, 0x0, 0xfb, - 0x1, 0x11, 0x30, 0x44, 0x13, 0x7f, 0x0, 0x6c, 0x0, 0xf9, 0x1b, 0x50, - 0x52, 0x40, 0x24, 0xe, 0x3, 0x7, 0x1, 0xf9, 0x5, 0x16, 0x33, 0x54, - 0x65, 0x52, 0xb, 0x7f, 0x0, 0x6c, 0x0, 0xfe, 0x10, 0x51, 0x2, 0x60, - 0xfb, 0x59, 0x49, 0x35, 0x26, 0x23, 0x3, 0x1f, 0xf7, 0x23, 0x2a, 0x3d, - 0x58, 0x63, 0x64, 0x62, 0x44, 0x6, 0x7f, 0x0, 0x6c, 0x0, 0xfe, 0x9, - 0x48, 0x4, 0x60, 0xf6, 0x5f, 0x5b, 0x59, 0x51, 0x4e, 0x54, 0x5a, 0x5d, - 0x60, 0x63, 0x3, 0x60, 0xfe, 0x33, 0x2, 0x7f, 0x0, 0x6c, 0x0, 0xfd, - 0x4, 0x3b, 0x5e, 0x6, 0x60, 0xfe, 0x5d, 0x5c, 0x7, 0x60, 0xfe, 0x5b, - 0x24, 0x7f, 0x0, 0x6d, 0x0, 0xfd, 0x2, 0x2f, 0x5d, 0xf, 0x60, 0xfe, - 0x56, 0x18, 0x7f, 0x0, 0x6e, 0x0, 0xfc, 0x22, 0x59, 0x60, 0x5e, 0xb, - 0x60, 0xfc, 0x5e, 0x60, 0x4f, 0xe, 0x7f, 0x0, 0x6e, 0x0, 0xfc, 0x1b, - 0x56, 0x5a, 0x5c, 0xa, 0x60, 0xfb, 0x5e, 0x5a, 0x5d, 0x41, 0x5, 0x7f, - 0x0, 0x6e, 0x0, 0xfd, 0x11, 0x4b, 0x59, 0xc, 0x60, 0xfc, 0x5c, 0x57, - 0x2c, 0x3, 0x7f, 0x0, 0x6e, 0x0, 0xfd, 0x1b, 0x54, 0x5f, 0xd, 0x60, - 0xfd, 0x59, 0x2c, 0x2, 0xa, 0x0, 0xfe, 0x4, 0x17, 0x3, 0x1c, 0xff, - 0xe, 0x6, 0x0, 0xfe, 0x9, 0x4, 0x35, 0x0, 0xfe, 0x4, 0x17, 0x3, - 0x1c, 0xff, 0xe, 0x6, 0x0, 0xfe, 0x9, 0x4, 0x7f, 0x0, 0x13, 0x0, - 0xfe, 0x31, 0x5e, 0xe, 0x60, 0xfd, 0x5f, 0x54, 0x19, 0x8, 0x0, 0xfc, - 0x4, 0x41, 0x87, 0xbb, 0x2, 0xca, 0xfc, 0xc7, 0xad, 0x7e, 0x2e, 0x3, - 0x0, 0xfd, 0x3c, 0x93, 0x45, 0x33, 0x0, 0xfc, 0x4, 0x41, 0x87, 0xbb, - 0x2, 0xca, 0xfc, 0xc7, 0xad, 0x7e, 0x2e, 0x3, 0x0, 0xfd, 0x3c, 0x93, - 0x45, 0xa, 0x0, 0xfe, 0x23, 0x21, 0x5, 0x0, 0xfd, 0x3f, 0x8b, 0x79, - 0x7d, 0x0, 0xfe, 0x9, 0x47, 0x10, 0x60, 0xfe, 0x64, 0x31, 0x8, 0x0, - 0xf0, 0x76, 0xdb, 0xec, 0xdd, 0xd3, 0xcd, 0xd6, 0xe0, 0xec, 0xcd, 0x72, - 0x0, 0x4, 0x76, 0xe6, 0x7a, 0x33, 0x0, 0xf0, 0x76, 0xdb, 0xec, 0xdd, - 0xd3, 0xcd, 0xd6, 0xe0, 0xec, 0xcd, 0x72, 0x0, 0x4, 0x76, 0xe6, 0x7a, - 0x9, 0x0, 0xfc, 0x25, 0xc6, 0xcb, 0x25, 0x3, 0x0, 0xfc, 0x76, 0xec, - 0xee, 0x85, 0x7d, 0x0, 0xfe, 0x19, 0x57, 0x10, 0x60, 0xfd, 0x63, 0x4a, - 0x8, 0x6, 0x0, 0xef, 0x60, 0xdb, 0xe0, 0x96, 0x45, 0x1c, 0xe, 0x25, - 0x4a, 0xa6, 0xe2, 0xdb, 0x41, 0x4, 0x76, 0xe6, 0x7a, 0x32, 0x0, 0xef, - 0x60, 0xdb, 0xe0, 0x96, 0x45, 0x1c, 0xe, 0x25, 0x4a, 0xa6, 0xe2, 0xdb, - 0x41, 0x4, 0x76, 0xe6, 0x7a, 0x9, 0x0, 0xfc, 0x25, 0xbf, 0xc6, 0x25, - 0x2, 0x0, 0xfc, 0x11, 0xe0, 0xd2, 0x43, 0x4, 0x0, 0xfe, 0x9f, 0xad, - 0x77, 0x0, 0xfd, 0x1, 0x1e, 0x56, 0xf, 0x60, 0xfc, 0x61, 0x65, 0x4b, - 0xc, 0x5, 0x0, 0xfb, 0x4, 0xad, 0xe8, 0x82, 0x4, 0x5, 0x0, 0xf8, - 0x12, 0x7e, 0x9e, 0x25, 0x4, 0x76, 0xe6, 0x7a, 0x31, 0x0, 0xfb, 0x4, - 0xad, 0xe8, 0x82, 0x4, 0x5, 0x0, 0xf8, 0x12, 0x7e, 0x9e, 0x25, 0x4, - 0x76, 0xe6, 0x7a, 0xa, 0x0, 0xfe, 0x29, 0x2f, 0x3, 0x0, 0xfd, 0x43, - 0xf2, 0x8b, 0x5, 0x0, 0x2, 0xcd, 0x78, 0x0, 0xfc, 0x4, 0x3b, 0x61, - 0x65, 0xc, 0x60, 0xfc, 0x64, 0x5c, 0x39, 0x12, 0x6, 0x0, 0xfc, 0x17, - 0xc7, 0xdb, 0x33, 0x7, 0x0, 0xf9, 0x4, 0xe, 0x0, 0x4, 0x76, 0xe6, - 0x7a, 0x2, 0x0, 0xfd, 0x12, 0x1c, 0xe, 0x9, 0x0, 0xff, 0x12, 0x2, - 0x1c, 0xff, 0x4, 0x2, 0x0, 0xfe, 0xe, 0x9, 0x2, 0x0, 0xff, 0xe, - 0x3, 0x0, 0xff, 0x4, 0x2, 0x1c, 0xff, 0x4, 0x9, 0x0, 0xff, 0xe, - 0x2, 0x1c, 0xff, 0x17, 0x4, 0x0, 0xfc, 0x17, 0xc7, 0xdb, 0x33, 0x7, - 0x0, 0xf9, 0x4, 0xe, 0x0, 0x4, 0x76, 0xe6, 0x7a, 0x2, 0x0, 0xfd, - 0x12, 0x1c, 0xe, 0xa, 0x0, 0xfd, 0x58, 0xf4, 0x6a, 0x5, 0x0, 0xfe, - 0xcb, 0xd0, 0x77, 0x0, 0xfc, 0x4, 0x27, 0x54, 0x60, 0x2, 0x64, 0xff, - 0x62, 0x8, 0x60, 0xfb, 0x61, 0x62, 0x4e, 0x22, 0x4, 0x7, 0x0, 0xfc, - 0x12, 0xc1, 0xe4, 0x60, 0xa, 0x0, 0xf5, 0x4, 0x76, 0xe6, 0x7a, 0x2a, - 0x72, 0xb0, 0xc4, 0xb0, 0x76, 0x20, 0x4, 0x0, 0xe9, 0x4, 0x38, 0x87, - 0xb4, 0xc4, 0xc1, 0x96, 0x41, 0x17, 0x8b, 0x8f, 0x17, 0x5c, 0xa2, 0x33, - 0xe, 0x58, 0xa2, 0xc1, 0xbe, 0x96, 0x4a, 0x4, 0x5, 0x0, 0xfd, 0x2a, - 0x76, 0xb0, 0x2, 0xc4, 0xfd, 0xbb, 0x82, 0x38, 0x2, 0x0, 0xfc, 0x12, - 0xc1, 0xe4, 0x60, 0xa, 0x0, 0xf5, 0x4, 0x76, 0xe6, 0x7a, 0x2a, 0x72, - 0xb0, 0xc4, 0xb0, 0x76, 0x20, 0x3, 0x0, 0xee, 0x51, 0x4f, 0x0, 0x3f, - 0x6d, 0xaf, 0xf4, 0xbd, 0x70, 0x43, 0x4, 0x6a, 0x7f, 0xe5, 0xe9, 0x7f, - 0x64, 0xd, 0x73, 0x0, 0xfd, 0x9, 0x3a, 0x5d, 0x4, 0x60, 0xff, 0x5e, - 0x7, 0x60, 0x2, 0x63, 0xfe, 0x41, 0x11, 0xa, 0x0, 0xfb, 0x82, 0xe8, - 0xd0, 0x6d, 0x25, 0x8, 0x0, 0xfa, 0x4, 0x76, 0xe6, 0xa2, 0xb0, 0xdb, - 0x2, 0xd3, 0xfc, 0xe4, 0xe6, 0xa6, 0x1c, 0x3, 0x0, 0xfc, 0x69, 0xca, - 0xea, 0xdb, 0x2, 0xcd, 0xee, 0xe2, 0xcd, 0x7e, 0xca, 0xd6, 0x2e, 0x93, - 0xe6, 0x76, 0xa6, 0xe2, 0xe4, 0xd3, 0xdd, 0xe8, 0xdd, 0x96, 0x17, 0x3, - 0x0, 0xfc, 0x45, 0xbe, 0xe6, 0xd0, 0x2, 0xc1, 0xfc, 0xd3, 0xe4, 0xc4, - 0x4f, 0x2, 0x0, 0xfb, 0x82, 0xe8, 0xd0, 0x6d, 0x25, 0x8, 0x0, 0xfa, - 0x4, 0x76, 0xe6, 0xa2, 0xb0, 0xdb, 0x2, 0xd3, 0xfc, 0xe4, 0xe6, 0xa6, - 0x1c, 0x2, 0x0, 0xf3, 0xd6, 0xcb, 0x0, 0x99, 0xe1, 0xe7, 0xf8, 0xea, - 0xe4, 0x9f, 0x37, 0xdd, 0xe4, 0x2, 0xf4, 0xfd, 0xe4, 0xd9, 0x45, 0x72, - 0x0, 0xfd, 0xa, 0x3a, 0x62, 0x4, 0x60, 0xfd, 0x5e, 0x57, 0x5c, 0x2, - 0x61, 0xf9, 0x80, 0x88, 0x65, 0x64, 0x5b, 0x48, 0x19, 0xb, 0x0, 0xfe, - 0x1c, 0xa6, 0x2, 0xe4, 0xf9, 0xd0, 0xad, 0x87, 0x60, 0x38, 0x17, 0x4, - 0x2, 0x0, 0xfa, 0x4, 0x76, 0xea, 0xe2, 0xcd, 0x69, 0x2, 0x2a, 0xf5, - 0x5c, 0xbb, 0xea, 0x93, 0x9, 0x0, 0x4a, 0xd3, 0xe6, 0xa2, 0x41, 0x2, - 0x25, 0xe7, 0x60, 0xb0, 0xdb, 0xe6, 0xd6, 0x2e, 0x93, 0xec, 0xd6, 0xe4, - 0x9e, 0x4f, 0x2a, 0x3c, 0x76, 0xca, 0xea, 0x8b, 0x4, 0x0, 0x2e, 0xbe, - 0xe2, 0x96, 0x2e, 0x2, 0x12, 0xf8, 0x2e, 0x87, 0xdd, 0xc1, 0x20, 0x0, - 0x1c, 0xa6, 0x2, 0xe4, 0xf9, 0xd0, 0xad, 0x87, 0x60, 0x38, 0x17, 0x4, - 0x2, 0x0, 0xfa, 0x4, 0x76, 0xea, 0xe2, 0xcd, 0x69, 0x2, 0x2a, 0xe9, - 0x5c, 0xbb, 0xea, 0x93, 0x9, 0x0, 0xdd, 0xcd, 0x0, 0x1, 0x13, 0x7c, - 0xf4, 0x8e, 0x1b, 0x7, 0x0, 0x11, 0x33, 0xd4, 0xd6, 0x37, 0x11, 0x72, - 0x0, 0xfe, 0x10, 0x3e, 0x2, 0x61, 0x5, 0x60, 0xf5, 0x59, 0x55, 0x61, - 0x76, 0xc5, 0xd8, 0x96, 0x5b, 0x49, 0x32, 0x9, 0xc, 0x0, 0xfc, 0x12, - 0x5c, 0xa2, 0xc7, 0x2, 0xe0, 0xf5, 0xe2, 0xdd, 0xc1, 0x8b, 0x33, 0x0, - 0x4, 0x76, 0xec, 0xdd, 0x60, 0x4, 0x0, 0xf7, 0x45, 0xd8, 0xcd, 0x2a, - 0x9, 0x9e, 0xe6, 0x87, 0xe, 0x4, 0x0, 0xf6, 0x25, 0xbe, 0xee, 0xd6, - 0x2e, 0x93, 0xee, 0xe6, 0x82, 0x12, 0x4, 0x0, 0xf7, 0x4a, 0xd8, 0xd3, - 0x38, 0x0, 0x87, 0xe8, 0x93, 0x12, 0x4, 0x0, 0xfc, 0x9, 0x93, 0xe8, - 0x69, 0x2, 0x0, 0xfc, 0x12, 0x5c, 0xa2, 0xc7, 0x2, 0xe0, 0xf5, 0xe2, - 0xdd, 0xc1, 0x8b, 0x33, 0x0, 0x4, 0x76, 0xec, 0xdd, 0x60, 0x4, 0x0, - 0xf9, 0x45, 0xd8, 0xcd, 0x2a, 0x9, 0xdd, 0xcd, 0x3, 0x0, 0xfd, 0x51, - 0xf4, 0x64, 0x5, 0x0, 0xfe, 0xd4, 0xcd, 0x73, 0x0, 0xfd, 0xd, 0x46, - 0x64, 0x7, 0x60, 0xf6, 0x5e, 0x53, 0x55, 0x89, 0xea, 0xef, 0xbf, 0x54, - 0x3c, 0x1f, 0xf, 0x0, 0xf1, 0x9, 0x1c, 0x3c, 0x5c, 0x87, 0xb4, 0xdb, - 0xea, 0xbb, 0x38, 0x4, 0x76, 0xea, 0xa2, 0x9, 0x4, 0x0, 0xfb, 0x9, - 0xb0, 0xe0, 0x4a, 0x25, 0x2, 0xd0, 0xff, 0x2e, 0x6, 0x0, 0xf8, 0x69, - 0xe4, 0xd6, 0x2e, 0x93, 0xee, 0xc4, 0x20, 0x5, 0x0, 0xf8, 0x4, 0x93, - 0xe4, 0x6d, 0x1c, 0xc4, 0xdb, 0x3c, 0x6, 0x0, 0xfd, 0x45, 0xdd, 0x9e, - 0x4, 0x0, 0xf1, 0x9, 0x1c, 0x3c, 0x5c, 0x87, 0xb4, 0xdb, 0xea, 0xbb, - 0x38, 0x4, 0x76, 0xea, 0xa2, 0x9, 0x4, 0x0, 0xf9, 0x9, 0xb0, 0xe0, - 0x4a, 0x25, 0xdd, 0xcd, 0x3, 0x0, 0xfd, 0x51, 0xf4, 0x64, 0x5, 0x0, - 0xfe, 0xd4, 0xcd, 0x73, 0x0, 0xfe, 0x1b, 0x5e, 0x8, 0x60, 0xf9, 0x5f, - 0x56, 0x50, 0x57, 0xa4, 0xc7, 0x70, 0x2, 0x39, 0xff, 0x12, 0x14, 0x0, - 0xf7, 0x4, 0x4f, 0xbe, 0xec, 0xad, 0x12, 0x76, 0xe6, 0x7a, 0x5, 0x0, - 0xf8, 0x4, 0x93, 0xe2, 0x5c, 0x33, 0xdd, 0xad, 0xe, 0x6, 0x0, 0xf8, - 0x33, 0xd8, 0xd6, 0x2e, 0x93, 0xee, 0xa2, 0x9, 0x6, 0x0, 0xf9, 0x60, - 0xe4, 0x87, 0x2a, 0xd6, 0xe4, 0xb7, 0x6, 0xb0, 0xfd, 0xbe, 0xea, 0xb7, - 0x9, 0x0, 0xf7, 0x4, 0x4f, 0xbe, 0xec, 0xad, 0x12, 0x76, 0xe6, 0x7a, - 0x5, 0x0, 0xf9, 0x4, 0x93, 0xe2, 0x5c, 0x33, 0xdd, 0xcd, 0x3, 0x0, - 0xfd, 0x51, 0xf4, 0x64, 0x5, 0x0, 0xfe, 0xd4, 0xcd, 0x73, 0x0, 0xfe, - 0x1b, 0x5e, 0x9, 0x60, 0xf7, 0x5b, 0x51, 0x4f, 0x5c, 0x60, 0x3d, 0x3f, - 0x2e, 0x7, 0x16, 0x0, 0xf9, 0x4a, 0xe0, 0xd6, 0x2e, 0x76, 0xe6, 0x7a, - 0x5, 0x0, 0xf8, 0x4, 0x93, 0xe2, 0x5c, 0x33, 0xdd, 0xa6, 0x4, 0x6, - 0x0, 0xff, 0x20, 0x2, 0xd6, 0xfb, 0x2e, 0x93, 0xee, 0x96, 0x9, 0x6, - 0x0, 0xf9, 0x60, 0xe4, 0x8b, 0x2a, 0xd6, 0xe6, 0xc7, 0x7, 0xc4, 0xfe, - 0xc1, 0x93, 0xb, 0x0, 0xf9, 0x4a, 0xe0, 0xd6, 0x2e, 0x76, 0xe6, 0x7a, - 0x5, 0x0, 0xf9, 0x4, 0x93, 0xe2, 0x5c, 0x33, 0xdd, 0xcd, 0x3, 0x0, - 0xfd, 0x51, 0xf4, 0x64, 0x5, 0x0, 0xfe, 0xd4, 0xcd, 0x73, 0x0, 0xfe, - 0x1b, 0x5e, 0xa, 0x60, 0xff, 0x55, 0x2, 0x50, 0xfc, 0x42, 0x40, 0x3f, - 0x1f, 0xd, 0x0, 0xfe, 0x2e, 0x20, 0x8, 0x0, 0xf9, 0x20, 0xd3, 0xdd, - 0x33, 0x76, 0xe6, 0x7a, 0x5, 0x0, 0xf8, 0x4, 0x93, 0xe2, 0x5c, 0x2e, - 0xd8, 0xbb, 0xe, 0x6, 0x0, 0xf8, 0x45, 0xe2, 0xd6, 0x2e, 0x93, 0xee, - 0xb0, 0x12, 0x5, 0x0, 0xf8, 0x4, 0x87, 0xe6, 0x7e, 0x17, 0xc4, 0xd3, - 0x41, 0x9, 0x1c, 0xfd, 0x0, 0x2e, 0x20, 0x8, 0x0, 0xf9, 0x20, 0xd3, - 0xdd, 0x33, 0x76, 0xe6, 0x7a, 0x5, 0x0, 0xf9, 0x4, 0x93, 0xe2, 0x5c, - 0x2e, 0xdd, 0xcd, 0x3, 0x0, 0xfd, 0x51, 0xf4, 0x64, 0x5, 0x0, 0xfe, - 0xd4, 0xcd, 0x73, 0x0, 0xfe, 0x1c, 0x5e, 0x7, 0x60, 0xfc, 0x5d, 0x5e, - 0x60, 0x58, 0x2, 0x50, 0xfc, 0x47, 0x40, 0x36, 0xe, 0xc, 0x0, 0xfc, - 0x4f, 0xd3, 0xb7, 0x33, 0x7, 0x0, 0xf9, 0x60, 0xe4, 0xc4, 0x17, 0x76, - 0xe6, 0x7a, 0x5, 0x0, 0xf8, 0x4, 0x93, 0xe2, 0x5c, 0x12, 0xbb, 0xe2, - 0x65, 0x6, 0x0, 0xf8, 0x8f, 0xea, 0xd6, 0x2e, 0x93, 0xee, 0xdb, 0x58, - 0x5, 0x0, 0xf7, 0x25, 0xbe, 0xe0, 0x53, 0x0, 0x9a, 0xe6, 0x7e, 0x9, - 0x5, 0x0, 0xf9, 0x12, 0x4, 0x0, 0x4f, 0xd3, 0xb7, 0x33, 0x7, 0x0, - 0xf9, 0x60, 0xe4, 0xc4, 0x17, 0x76, 0xe6, 0x7a, 0x5, 0x0, 0xf9, 0x4, - 0x93, 0xe2, 0x5c, 0x12, 0xdd, 0xcd, 0x3, 0x0, 0xfd, 0x51, 0xf4, 0x64, - 0x5, 0x0, 0xfe, 0xcb, 0xd2, 0x73, 0x0, 0xfd, 0x1c, 0x5d, 0x61, 0x5, - 0x60, 0xf5, 0x5d, 0x58, 0x55, 0x5a, 0x5b, 0x52, 0x50, 0x47, 0x3f, 0x28, - 0x3, 0xc, 0x0, 0xfa, 0x33, 0xc4, 0xe8, 0xbb, 0x5c, 0x17, 0x3, 0x4, - 0xf7, 0xe, 0x5c, 0xc7, 0xec, 0x8b, 0x9, 0x76, 0xe6, 0x7a, 0x5, 0x0, - 0xf6, 0x4, 0x93, 0xe2, 0x5c, 0x0, 0x65, 0xe4, 0xc7, 0x4a, 0x9, 0x2, - 0x4, 0xf4, 0x12, 0x76, 0xdb, 0xec, 0xd6, 0x2e, 0x93, 0xee, 0xea, 0xc4, - 0x4a, 0x9, 0x2, 0x4, 0xf5, 0x33, 0xb0, 0xec, 0xb4, 0x1c, 0x0, 0x4a, - 0xd3, 0xd8, 0x6d, 0xe, 0x3, 0x4, 0xf6, 0x45, 0xa2, 0x76, 0x4, 0x33, - 0xc4, 0xe8, 0xbb, 0x5c, 0x17, 0x3, 0x4, 0xf7, 0xe, 0x5c, 0xc7, 0xec, - 0x8b, 0x9, 0x76, 0xe6, 0x7a, 0x5, 0x0, 0xf9, 0x4, 0x93, 0xe2, 0x5c, - 0x0, 0xdd, 0xcd, 0x3, 0x0, 0xfd, 0x51, 0xf4, 0x64, 0x5, 0x0, 0xfd, - 0xb3, 0xe5, 0x37, 0x72, 0x0, 0xfd, 0x9, 0x40, 0x66, 0x6, 0x60, 0xfc, - 0x5f, 0x5b, 0x56, 0x54, 0x2, 0x50, 0xfc, 0x47, 0x3e, 0x19, 0x1, 0xd, - 0x0, 0xef, 0x4a, 0xbe, 0xee, 0xe2, 0xc1, 0x9a, 0x93, 0xa9, 0xc4, 0xe2, - 0xea, 0xa6, 0x20, 0x4, 0x76, 0xe6, 0x7a, 0x5, 0x0, 0xe2, 0x4, 0x93, - 0xe2, 0x5c, 0x0, 0x9, 0x9a, 0xee, 0xd8, 0xa2, 0x8b, 0x93, 0xb7, 0xe4, - 0xb7, 0xdd, 0xd6, 0x2e, 0x93, 0xe6, 0xbb, 0xd3, 0xdd, 0xb4, 0x93, 0xa9, - 0xd6, 0xec, 0xbe, 0x41, 0x3, 0x0, 0xf6, 0x7e, 0xe6, 0xe4, 0xbe, 0xa2, - 0x9e, 0xbb, 0xdd, 0xe2, 0x7e, 0x2, 0x0, 0xef, 0x4a, 0xbe, 0xee, 0xe2, - 0xc1, 0x9a, 0x93, 0xa9, 0xc4, 0xe2, 0xea, 0xa6, 0x20, 0x4, 0x76, 0xe6, - 0x7a, 0x5, 0x0, 0xf9, 0x4, 0x93, 0xe2, 0x5c, 0x0, 0xdd, 0xcd, 0x3, - 0x0, 0xfd, 0x51, 0xf4, 0x64, 0x5, 0x0, 0xfb, 0x5e, 0xe7, 0xcd, 0x8b, - 0x11, 0x71, 0x0, 0xfd, 0x14, 0x52, 0x64, 0x7, 0x60, 0xf9, 0x5f, 0x5c, - 0x6b, 0x5d, 0x43, 0x33, 0xa, 0xf, 0x0, 0xfb, 0x2a, 0x87, 0xc4, 0xdd, - 0xe4, 0x3, 0xe2, 0xf8, 0xc7, 0x7e, 0x17, 0x0, 0x4, 0x6d, 0xd6, 0x69, - 0x5, 0x0, 0xfc, 0x4, 0x82, 0xd0, 0x53, 0x2, 0x0, 0xfc, 0x12, 0x7e, - 0xc1, 0xdb, 0x2, 0xdd, 0xf5, 0xc7, 0x7a, 0x33, 0xbe, 0xc1, 0x2a, 0x93, - 0xe6, 0x65, 0x4a, 0xb0, 0x2, 0xdd, 0xfc, 0xe0, 0xd0, 0x9e, 0x33, 0x4, - 0x0, 0xfc, 0x4, 0x58, 0xb4, 0xd8, 0x2, 0xe0, 0xfc, 0xd3, 0xb4, 0x69, - 0xe, 0x3, 0x0, 0xfb, 0x2a, 0x87, 0xc4, 0xdd, 0xe4, 0x3, 0xe2, 0xf8, - 0xc7, 0x7e, 0x17, 0x0, 0x4, 0x6d, 0xd6, 0x69, 0x5, 0x0, 0xf9, 0x4, - 0x82, 0xd0, 0x53, 0x0, 0xad, 0xa4, 0x3, 0x0, 0xfd, 0x43, 0xd4, 0x49, - 0x6, 0x0, 0xfc, 0x82, 0xd6, 0xe1, 0x4b, 0x71, 0x0, 0xfc, 0x1, 0x29, - 0x65, 0x62, 0x6, 0x60, 0xf9, 0x5e, 0x7a, 0xc6, 0xb4, 0x69, 0x25, 0x3, - 0x11, 0x0, 0xf8, 0x1c, 0x3c, 0x60, 0x69, 0x58, 0x3c, 0x1c, 0x4, 0x3, - 0x0, 0xfd, 0x9, 0x25, 0xe, 0x6, 0x0, 0xfd, 0x12, 0x25, 0x9, 0x4, - 0x0, 0xfb, 0x20, 0x41, 0x4a, 0x41, 0x25, 0x2, 0x0, 0xf3, 0x20, 0x25, - 0x9, 0x93, 0xe6, 0x5c, 0x0, 0x12, 0x38, 0x4a, 0x3c, 0x20, 0xe, 0x7, - 0x0, 0xfa, 0x12, 0x33, 0x4a, 0x41, 0x2a, 0x12, 0x7, 0x0, 0xf8, 0x1c, - 0x3c, 0x60, 0x69, 0x58, 0x3c, 0x1c, 0x4, 0x3, 0x0, 0xfd, 0x9, 0x25, - 0xe, 0x6, 0x0, 0xfc, 0x12, 0x25, 0x9, 0x0, 0x2, 0x25, 0x3, 0x0, - 0xfd, 0xe, 0x25, 0xe, 0x8, 0x0, 0xff, 0x13, 0x73, 0x0, 0xfd, 0x7, - 0x46, 0x64, 0x5, 0x60, 0xfd, 0x5f, 0x6c, 0xb9, 0x2, 0xef, 0xfc, 0xda, - 0x8a, 0x35, 0x5, 0x34, 0x0, 0xfc, 0x4, 0x93, 0xe6, 0x5c, 0x7f, 0x0, - 0x39, 0x0, 0xfd, 0x1b, 0x58, 0x61, 0x4, 0x60, 0xfd, 0x66, 0xa7, 0xe9, - 0x3, 0xf0, 0xfc, 0xeb, 0xc4, 0x73, 0x14, 0x33, 0x0, 0xfc, 0x4, 0x93, - 0xe6, 0x5c, 0x7f, 0x0, 0x39, 0x0, 0xfd, 0x2, 0x35, 0x64, 0x3, 0x60, - 0xfd, 0x5e, 0x9a, 0xe2, 0x6, 0xf0, 0xfe, 0xd7, 0x3d, 0x33, 0x0, 0xfc, - 0x4, 0x93, 0xe6, 0x5c, 0x7f, 0x0, 0x3a, 0x0, 0xf9, 0xd, 0x4d, 0x64, - 0x60, 0x5d, 0x83, 0xd8, 0x7, 0xf0, 0xfe, 0xde, 0x43, 0x33, 0x0, 0xfc, - 0x4, 0x93, 0xe6, 0x5c, 0x7f, 0x0, 0x3a, 0x0, 0xfa, 0x1, 0x24, 0x5c, - 0x61, 0x81, 0xce, 0x8, 0xf0, 0xfe, 0xde, 0x43, 0x34, 0x0, 0xfd, 0x4a, - 0x87, 0x2e, 0x7f, 0x0, 0x3b, 0x0, 0xfb, 0x2, 0x37, 0x6e, 0xbc, 0xef, - 0x7, 0xf0, 0xfd, 0xef, 0xcd, 0x37, 0x7f, 0x0, 0x73, 0x0, 0xfa, 0x11, - 0x51, 0x9f, 0xc8, 0xe1, 0xef, 0x4, 0xf0, 0xfc, 0xe1, 0xa0, 0x4f, 0x9, - 0x7f, 0x0, 0x74, 0x0, 0xf4, 0x8, 0x1c, 0x3d, 0x6c, 0xa2, 0xce, 0xe7, - 0xe4, 0xaf, 0x5c, 0x18, 0x2, 0x7f, 0x0, 0x78, 0x0, 0xfa, 0x7, 0x17, - 0x3d, 0x70, 0x67, 0x21, 0x7f, 0x0, 0x7d, 0x0, 0xff, 0x1, 0x2, 0x3, - 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, - 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, - 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, - 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, - 0x7f, 0x0, 0x7f, 0x0, 0x7f, 0x0, 0x54, 0x0}; -static const Image fox_logo_image = {256, 64, 2432, fox_logo_data}; - -const VariantAnimation fox_logo = { - 21, - { - {0, 0, 25, 0, &fox_logo_image}, {0, 0, 25, 5, &fox_logo_image}, - {0, 0, 25, 10, &fox_logo_image}, {0, 0, 25, 15, &fox_logo_image}, - {0, 0, 25, 20, &fox_logo_image}, {0, 0, 25, 25, &fox_logo_image}, - {0, 0, 25, 30, &fox_logo_image}, {0, 0, 25, 35, &fox_logo_image}, - {0, 0, 25, 40, &fox_logo_image}, {0, 0, 25, 45, &fox_logo_image}, - {0, 0, 25, 50, &fox_logo_image}, {0, 0, 25, 55, &fox_logo_image}, - {0, 0, 25, 60, &fox_logo_image}, {0, 0, 25, 65, &fox_logo_image}, - {0, 0, 25, 70, &fox_logo_image}, {0, 0, 25, 75, &fox_logo_image}, - {0, 0, 25, 80, &fox_logo_image}, {0, 0, 25, 85, &fox_logo_image}, - {0, 0, 25, 90, &fox_logo_image}, {0, 0, 25, 95, &fox_logo_image}, - {0, 0, 25, 100, &fox_logo_image}, - }}; -const VariantAnimation fox_logo_reversed = { - 21, - { - {0, 0, 25, 100, &fox_logo_image}, {0, 0, 25, 95, &fox_logo_image}, - {0, 0, 25, 90, &fox_logo_image}, {0, 0, 25, 85, &fox_logo_image}, - {0, 0, 25, 80, &fox_logo_image}, {0, 0, 25, 75, &fox_logo_image}, - {0, 0, 25, 70, &fox_logo_image}, {0, 0, 25, 65, &fox_logo_image}, - {0, 0, 25, 60, &fox_logo_image}, {0, 0, 25, 55, &fox_logo_image}, - {0, 0, 25, 50, &fox_logo_image}, {0, 0, 25, 45, &fox_logo_image}, - {0, 0, 25, 40, &fox_logo_image}, {0, 0, 25, 35, &fox_logo_image}, - {0, 0, 25, 30, &fox_logo_image}, {0, 0, 25, 25, &fox_logo_image}, - {0, 0, 25, 20, &fox_logo_image}, {0, 0, 25, 15, &fox_logo_image}, - {0, 0, 25, 10, &fox_logo_image}, {0, 0, 25, 5, &fox_logo_image}, - {0, 0, 25, 0, &fox_logo_image}, - }}; - -const uint8_t fox_screensaver_data[617] = { - 0x5, 0x0, 0xfe, 0xa, 0x7, 0x10, 0x0, 0xfd, 0x1, 0xa, 0x4, 0x4, - 0x0, 0xfb, 0x1, 0x23, 0x35, 0x1c, 0x6, 0xc, 0x0, 0xfb, 0x1, 0x11, - 0x30, 0x44, 0x13, 0x5, 0x0, 0xf9, 0x1b, 0x50, 0x52, 0x40, 0x24, 0xe, - 0x3, 0x7, 0x1, 0xf9, 0x5, 0x16, 0x33, 0x54, 0x65, 0x52, 0xb, 0x5, - 0x0, 0xfe, 0x10, 0x51, 0x2, 0x60, 0xfb, 0x59, 0x49, 0x35, 0x26, 0x23, - 0x3, 0x1f, 0xf7, 0x23, 0x2a, 0x3d, 0x58, 0x63, 0x64, 0x62, 0x44, 0x6, - 0x5, 0x0, 0xfe, 0x9, 0x48, 0x4, 0x60, 0xf6, 0x5f, 0x5b, 0x59, 0x51, - 0x4e, 0x54, 0x5a, 0x5d, 0x60, 0x63, 0x3, 0x60, 0xfe, 0x33, 0x2, 0x5, - 0x0, 0xfd, 0x4, 0x3b, 0x5e, 0x6, 0x60, 0xfe, 0x5d, 0x5c, 0x7, 0x60, - 0xfe, 0x5b, 0x24, 0x6, 0x0, 0xfd, 0x2, 0x2f, 0x5d, 0xf, 0x60, 0xfe, - 0x56, 0x18, 0x7, 0x0, 0xfc, 0x22, 0x59, 0x60, 0x5e, 0xb, 0x60, 0xfc, - 0x5e, 0x60, 0x4f, 0xe, 0x7, 0x0, 0xfc, 0x1b, 0x56, 0x5a, 0x5c, 0xa, - 0x60, 0xfb, 0x5e, 0x5a, 0x5d, 0x41, 0x5, 0x7, 0x0, 0xfd, 0x11, 0x4b, - 0x59, 0xc, 0x60, 0xfc, 0x5c, 0x57, 0x2c, 0x3, 0x7, 0x0, 0xfd, 0x1b, - 0x54, 0x5f, 0xd, 0x60, 0xfd, 0x59, 0x2c, 0x2, 0x7, 0x0, 0xfe, 0x31, - 0x5e, 0xe, 0x60, 0xfd, 0x5f, 0x54, 0x19, 0x6, 0x0, 0xfe, 0x9, 0x47, - 0x10, 0x60, 0xfe, 0x64, 0x31, 0x6, 0x0, 0xfe, 0x19, 0x57, 0x10, 0x60, - 0xfd, 0x63, 0x4a, 0x8, 0x4, 0x0, 0xfd, 0x1, 0x1e, 0x56, 0xf, 0x60, - 0xfc, 0x61, 0x65, 0x4b, 0xc, 0x5, 0x0, 0xfc, 0x4, 0x3b, 0x61, 0x65, - 0xc, 0x60, 0xfc, 0x64, 0x5c, 0x39, 0x12, 0x5, 0x0, 0xfc, 0x4, 0x27, - 0x54, 0x60, 0x2, 0x64, 0xff, 0x62, 0x8, 0x60, 0xfb, 0x61, 0x62, 0x4e, - 0x22, 0x4, 0x5, 0x0, 0xfd, 0x9, 0x3a, 0x5d, 0x4, 0x60, 0xff, 0x5e, - 0x7, 0x60, 0x2, 0x63, 0xfe, 0x41, 0x11, 0x6, 0x0, 0xfd, 0xa, 0x3a, - 0x62, 0x4, 0x60, 0xfd, 0x5e, 0x57, 0x5c, 0x2, 0x61, 0xf9, 0x80, 0x88, - 0x65, 0x64, 0x5b, 0x48, 0x19, 0x6, 0x0, 0xfe, 0x10, 0x3e, 0x2, 0x61, - 0x5, 0x60, 0xf5, 0x59, 0x55, 0x61, 0x76, 0xc5, 0xd8, 0x96, 0x5b, 0x49, - 0x32, 0x9, 0x5, 0x0, 0xfd, 0xd, 0x46, 0x64, 0x7, 0x60, 0xf6, 0x5e, - 0x53, 0x55, 0x89, 0xea, 0xef, 0xbf, 0x54, 0x3c, 0x1f, 0x6, 0x0, 0xfe, - 0x1b, 0x5e, 0x8, 0x60, 0xf9, 0x5f, 0x56, 0x50, 0x57, 0xa4, 0xc7, 0x70, - 0x2, 0x39, 0xff, 0x12, 0x6, 0x0, 0xfe, 0x1b, 0x5e, 0x9, 0x60, 0xf7, - 0x5b, 0x51, 0x4f, 0x5c, 0x60, 0x3d, 0x3f, 0x2e, 0x7, 0x6, 0x0, 0xfe, - 0x1b, 0x5e, 0xa, 0x60, 0xff, 0x55, 0x2, 0x50, 0xfc, 0x42, 0x40, 0x3f, - 0x1f, 0x7, 0x0, 0xfe, 0x1c, 0x5e, 0x7, 0x60, 0xfc, 0x5d, 0x5e, 0x60, - 0x58, 0x2, 0x50, 0xfc, 0x47, 0x40, 0x36, 0xe, 0x7, 0x0, 0xfd, 0x1c, - 0x5d, 0x61, 0x5, 0x60, 0xf5, 0x5d, 0x58, 0x55, 0x5a, 0x5b, 0x52, 0x50, - 0x47, 0x3f, 0x28, 0x3, 0x7, 0x0, 0xfd, 0x9, 0x40, 0x66, 0x6, 0x60, - 0xfc, 0x5f, 0x5b, 0x56, 0x54, 0x2, 0x50, 0xfc, 0x47, 0x3e, 0x19, 0x1, - 0x8, 0x0, 0xfd, 0x14, 0x52, 0x64, 0x7, 0x60, 0xf9, 0x5f, 0x5c, 0x6b, - 0x5d, 0x43, 0x33, 0xa, 0x9, 0x0, 0xfc, 0x1, 0x29, 0x65, 0x62, 0x6, - 0x60, 0xf9, 0x5e, 0x7a, 0xc6, 0xb4, 0x69, 0x25, 0x3, 0xa, 0x0, 0xfd, - 0x7, 0x46, 0x64, 0x5, 0x60, 0xfd, 0x5f, 0x6c, 0xb9, 0x2, 0xef, 0xfc, - 0xda, 0x8a, 0x35, 0x5, 0xa, 0x0, 0xfd, 0x1b, 0x58, 0x61, 0x4, 0x60, - 0xfd, 0x66, 0xa7, 0xe9, 0x3, 0xf0, 0xfc, 0xeb, 0xc4, 0x73, 0x14, 0x9, - 0x0, 0xfd, 0x2, 0x35, 0x64, 0x3, 0x60, 0xfd, 0x5e, 0x9a, 0xe2, 0x6, - 0xf0, 0xfe, 0xd7, 0x3d, 0xa, 0x0, 0xf9, 0xd, 0x4d, 0x64, 0x60, 0x5d, - 0x83, 0xd8, 0x7, 0xf0, 0xfe, 0xde, 0x43, 0xa, 0x0, 0xfa, 0x1, 0x24, - 0x5c, 0x61, 0x81, 0xce, 0x8, 0xf0, 0xfe, 0xde, 0x43, 0xb, 0x0, 0xfb, - 0x2, 0x37, 0x6e, 0xbc, 0xef, 0x7, 0xf0, 0xfd, 0xef, 0xcd, 0x37, 0xc, - 0x0, 0xfa, 0x11, 0x51, 0x9f, 0xc8, 0xe1, 0xef, 0x4, 0xf0, 0xfc, 0xe1, - 0xa0, 0x4f, 0x9, 0xd, 0x0, 0xf4, 0x8, 0x1c, 0x3d, 0x6c, 0xa2, 0xce, - 0xe7, 0xe4, 0xaf, 0x5c, 0x18, 0x2, 0x11, 0x0, 0xfa, 0x7, 0x17, 0x3d, - 0x70, 0x67, 0x21, 0xa, 0x0}; -static const Image fox_screensaver_image = {26, 38, 617, fox_screensaver_data}; - -const VariantAnimation fox_screensaver = { - 460, - { - {115, 13, 125, 100, &fox_screensaver_image}, - {116, 13, 125, 100, &fox_screensaver_image}, - {117, 13, 125, 100, &fox_screensaver_image}, - {118, 13, 125, 100, &fox_screensaver_image}, - {119, 13, 125, 100, &fox_screensaver_image}, - {120, 13, 125, 100, &fox_screensaver_image}, - {121, 13, 125, 100, &fox_screensaver_image}, - {122, 13, 125, 100, &fox_screensaver_image}, - {123, 13, 125, 100, &fox_screensaver_image}, - {124, 13, 125, 100, &fox_screensaver_image}, - {125, 13, 125, 100, &fox_screensaver_image}, - {126, 13, 125, 100, &fox_screensaver_image}, - {127, 13, 125, 100, &fox_screensaver_image}, - {128, 13, 125, 100, &fox_screensaver_image}, - {129, 13, 125, 100, &fox_screensaver_image}, - {130, 13, 125, 100, &fox_screensaver_image}, - {131, 13, 125, 100, &fox_screensaver_image}, - {132, 13, 125, 100, &fox_screensaver_image}, - {133, 13, 125, 100, &fox_screensaver_image}, - {134, 13, 125, 100, &fox_screensaver_image}, - {135, 13, 125, 100, &fox_screensaver_image}, - {136, 13, 125, 100, &fox_screensaver_image}, - {137, 13, 125, 100, &fox_screensaver_image}, - {138, 13, 125, 100, &fox_screensaver_image}, - {139, 13, 125, 100, &fox_screensaver_image}, - {140, 13, 125, 100, &fox_screensaver_image}, - {141, 13, 125, 100, &fox_screensaver_image}, - {142, 13, 125, 100, &fox_screensaver_image}, - {143, 13, 125, 100, &fox_screensaver_image}, - {144, 13, 125, 100, &fox_screensaver_image}, - {145, 13, 125, 100, &fox_screensaver_image}, - {146, 13, 125, 100, &fox_screensaver_image}, - {147, 13, 125, 100, &fox_screensaver_image}, - {148, 13, 125, 100, &fox_screensaver_image}, - {149, 13, 125, 100, &fox_screensaver_image}, - {150, 13, 125, 100, &fox_screensaver_image}, - {151, 13, 125, 100, &fox_screensaver_image}, - {152, 13, 125, 100, &fox_screensaver_image}, - {153, 13, 125, 100, &fox_screensaver_image}, - {154, 13, 125, 100, &fox_screensaver_image}, - {155, 13, 125, 100, &fox_screensaver_image}, - {156, 13, 125, 100, &fox_screensaver_image}, - {157, 13, 125, 100, &fox_screensaver_image}, - {158, 13, 125, 100, &fox_screensaver_image}, - {159, 13, 125, 100, &fox_screensaver_image}, - {160, 13, 125, 100, &fox_screensaver_image}, - {161, 13, 125, 100, &fox_screensaver_image}, - {162, 13, 125, 100, &fox_screensaver_image}, - {163, 13, 125, 100, &fox_screensaver_image}, - {164, 13, 125, 100, &fox_screensaver_image}, - {165, 13, 125, 100, &fox_screensaver_image}, - {166, 13, 125, 100, &fox_screensaver_image}, - {167, 13, 125, 100, &fox_screensaver_image}, - {168, 13, 125, 100, &fox_screensaver_image}, - {169, 13, 125, 100, &fox_screensaver_image}, - {170, 13, 125, 100, &fox_screensaver_image}, - {171, 13, 125, 100, &fox_screensaver_image}, - {172, 13, 125, 100, &fox_screensaver_image}, - {173, 13, 125, 100, &fox_screensaver_image}, - {174, 13, 125, 100, &fox_screensaver_image}, - {175, 13, 125, 100, &fox_screensaver_image}, - {176, 13, 125, 100, &fox_screensaver_image}, - {177, 13, 125, 100, &fox_screensaver_image}, - {178, 13, 125, 100, &fox_screensaver_image}, - {179, 13, 125, 100, &fox_screensaver_image}, - {180, 13, 125, 100, &fox_screensaver_image}, - {181, 13, 125, 100, &fox_screensaver_image}, - {182, 13, 125, 100, &fox_screensaver_image}, - {183, 13, 125, 100, &fox_screensaver_image}, - {184, 13, 125, 100, &fox_screensaver_image}, - {185, 13, 125, 100, &fox_screensaver_image}, - {186, 13, 125, 100, &fox_screensaver_image}, - {187, 13, 125, 100, &fox_screensaver_image}, - {188, 13, 125, 100, &fox_screensaver_image}, - {189, 13, 125, 100, &fox_screensaver_image}, - {190, 13, 125, 100, &fox_screensaver_image}, - {191, 13, 125, 100, &fox_screensaver_image}, - {192, 13, 125, 100, &fox_screensaver_image}, - {193, 13, 125, 100, &fox_screensaver_image}, - {194, 13, 125, 100, &fox_screensaver_image}, - {195, 13, 125, 100, &fox_screensaver_image}, - {196, 13, 125, 100, &fox_screensaver_image}, - {197, 13, 125, 100, &fox_screensaver_image}, - {198, 13, 125, 100, &fox_screensaver_image}, - {199, 13, 125, 100, &fox_screensaver_image}, - {200, 13, 125, 100, &fox_screensaver_image}, - {201, 13, 125, 100, &fox_screensaver_image}, - {202, 13, 125, 100, &fox_screensaver_image}, - {203, 13, 125, 100, &fox_screensaver_image}, - {204, 13, 125, 100, &fox_screensaver_image}, - {205, 13, 125, 100, &fox_screensaver_image}, - {206, 13, 125, 100, &fox_screensaver_image}, - {207, 13, 125, 100, &fox_screensaver_image}, - {208, 13, 125, 100, &fox_screensaver_image}, - {209, 13, 125, 100, &fox_screensaver_image}, - {210, 13, 125, 100, &fox_screensaver_image}, - {211, 13, 125, 100, &fox_screensaver_image}, - {212, 13, 125, 100, &fox_screensaver_image}, - {213, 13, 125, 100, &fox_screensaver_image}, - {214, 13, 125, 100, &fox_screensaver_image}, - {215, 13, 125, 100, &fox_screensaver_image}, - {216, 13, 125, 100, &fox_screensaver_image}, - {217, 13, 125, 100, &fox_screensaver_image}, - {218, 13, 125, 100, &fox_screensaver_image}, - {219, 13, 125, 100, &fox_screensaver_image}, - {220, 13, 125, 100, &fox_screensaver_image}, - {221, 13, 125, 100, &fox_screensaver_image}, - {222, 13, 125, 100, &fox_screensaver_image}, - {223, 13, 125, 100, &fox_screensaver_image}, - {224, 13, 125, 100, &fox_screensaver_image}, - {225, 13, 125, 100, &fox_screensaver_image}, - {226, 13, 125, 100, &fox_screensaver_image}, - {227, 13, 125, 100, &fox_screensaver_image}, - {228, 13, 125, 100, &fox_screensaver_image}, - {229, 13, 125, 100, &fox_screensaver_image}, - {228, 13, 125, 100, &fox_screensaver_image}, - {227, 13, 125, 100, &fox_screensaver_image}, - {226, 13, 125, 100, &fox_screensaver_image}, - {225, 13, 125, 100, &fox_screensaver_image}, - {224, 13, 125, 100, &fox_screensaver_image}, - {223, 13, 125, 100, &fox_screensaver_image}, - {222, 13, 125, 100, &fox_screensaver_image}, - {221, 13, 125, 100, &fox_screensaver_image}, - {220, 13, 125, 100, &fox_screensaver_image}, - {219, 13, 125, 100, &fox_screensaver_image}, - {218, 13, 125, 100, &fox_screensaver_image}, - {217, 13, 125, 100, &fox_screensaver_image}, - {216, 13, 125, 100, &fox_screensaver_image}, - {215, 13, 125, 100, &fox_screensaver_image}, - {214, 13, 125, 100, &fox_screensaver_image}, - {213, 13, 125, 100, &fox_screensaver_image}, - {212, 13, 125, 100, &fox_screensaver_image}, - {211, 13, 125, 100, &fox_screensaver_image}, - {210, 13, 125, 100, &fox_screensaver_image}, - {209, 13, 125, 100, &fox_screensaver_image}, - {208, 13, 125, 100, &fox_screensaver_image}, - {207, 13, 125, 100, &fox_screensaver_image}, - {206, 13, 125, 100, &fox_screensaver_image}, - {205, 13, 125, 100, &fox_screensaver_image}, - {204, 13, 125, 100, &fox_screensaver_image}, - {203, 13, 125, 100, &fox_screensaver_image}, - {202, 13, 125, 100, &fox_screensaver_image}, - {201, 13, 125, 100, &fox_screensaver_image}, - {200, 13, 125, 100, &fox_screensaver_image}, - {199, 13, 125, 100, &fox_screensaver_image}, - {198, 13, 125, 100, &fox_screensaver_image}, - {197, 13, 125, 100, &fox_screensaver_image}, - {196, 13, 125, 100, &fox_screensaver_image}, - {195, 13, 125, 100, &fox_screensaver_image}, - {194, 13, 125, 100, &fox_screensaver_image}, - {193, 13, 125, 100, &fox_screensaver_image}, - {192, 13, 125, 100, &fox_screensaver_image}, - {191, 13, 125, 100, &fox_screensaver_image}, - {190, 13, 125, 100, &fox_screensaver_image}, - {189, 13, 125, 100, &fox_screensaver_image}, - {188, 13, 125, 100, &fox_screensaver_image}, - {187, 13, 125, 100, &fox_screensaver_image}, - {186, 13, 125, 100, &fox_screensaver_image}, - {185, 13, 125, 100, &fox_screensaver_image}, - {184, 13, 125, 100, &fox_screensaver_image}, - {183, 13, 125, 100, &fox_screensaver_image}, - {182, 13, 125, 100, &fox_screensaver_image}, - {181, 13, 125, 100, &fox_screensaver_image}, - {180, 13, 125, 100, &fox_screensaver_image}, - {179, 13, 125, 100, &fox_screensaver_image}, - {178, 13, 125, 100, &fox_screensaver_image}, - {177, 13, 125, 100, &fox_screensaver_image}, - {176, 13, 125, 100, &fox_screensaver_image}, - {175, 13, 125, 100, &fox_screensaver_image}, - {174, 13, 125, 100, &fox_screensaver_image}, - {173, 13, 125, 100, &fox_screensaver_image}, - {172, 13, 125, 100, &fox_screensaver_image}, - {171, 13, 125, 100, &fox_screensaver_image}, - {170, 13, 125, 100, &fox_screensaver_image}, - {169, 13, 125, 100, &fox_screensaver_image}, - {168, 13, 125, 100, &fox_screensaver_image}, - {167, 13, 125, 100, &fox_screensaver_image}, - {166, 13, 125, 100, &fox_screensaver_image}, - {165, 13, 125, 100, &fox_screensaver_image}, - {164, 13, 125, 100, &fox_screensaver_image}, - {163, 13, 125, 100, &fox_screensaver_image}, - {162, 13, 125, 100, &fox_screensaver_image}, - {161, 13, 125, 100, &fox_screensaver_image}, - {160, 13, 125, 100, &fox_screensaver_image}, - {159, 13, 125, 100, &fox_screensaver_image}, - {158, 13, 125, 100, &fox_screensaver_image}, - {157, 13, 125, 100, &fox_screensaver_image}, - {156, 13, 125, 100, &fox_screensaver_image}, - {155, 13, 125, 100, &fox_screensaver_image}, - {154, 13, 125, 100, &fox_screensaver_image}, - {153, 13, 125, 100, &fox_screensaver_image}, - {152, 13, 125, 100, &fox_screensaver_image}, - {151, 13, 125, 100, &fox_screensaver_image}, - {150, 13, 125, 100, &fox_screensaver_image}, - {149, 13, 125, 100, &fox_screensaver_image}, - {148, 13, 125, 100, &fox_screensaver_image}, - {147, 13, 125, 100, &fox_screensaver_image}, - {146, 13, 125, 100, &fox_screensaver_image}, - {145, 13, 125, 100, &fox_screensaver_image}, - {144, 13, 125, 100, &fox_screensaver_image}, - {143, 13, 125, 100, &fox_screensaver_image}, - {142, 13, 125, 100, &fox_screensaver_image}, - {141, 13, 125, 100, &fox_screensaver_image}, - {140, 13, 125, 100, &fox_screensaver_image}, - {139, 13, 125, 100, &fox_screensaver_image}, - {138, 13, 125, 100, &fox_screensaver_image}, - {137, 13, 125, 100, &fox_screensaver_image}, - {136, 13, 125, 100, &fox_screensaver_image}, - {135, 13, 125, 100, &fox_screensaver_image}, - {134, 13, 125, 100, &fox_screensaver_image}, - {133, 13, 125, 100, &fox_screensaver_image}, - {132, 13, 125, 100, &fox_screensaver_image}, - {131, 13, 125, 100, &fox_screensaver_image}, - {130, 13, 125, 100, &fox_screensaver_image}, - {129, 13, 125, 100, &fox_screensaver_image}, - {128, 13, 125, 100, &fox_screensaver_image}, - {127, 13, 125, 100, &fox_screensaver_image}, - {126, 13, 125, 100, &fox_screensaver_image}, - {125, 13, 125, 100, &fox_screensaver_image}, - {124, 13, 125, 100, &fox_screensaver_image}, - {123, 13, 125, 100, &fox_screensaver_image}, - {122, 13, 125, 100, &fox_screensaver_image}, - {121, 13, 125, 100, &fox_screensaver_image}, - {120, 13, 125, 100, &fox_screensaver_image}, - {119, 13, 125, 100, &fox_screensaver_image}, - {118, 13, 125, 100, &fox_screensaver_image}, - {117, 13, 125, 100, &fox_screensaver_image}, - {116, 13, 125, 100, &fox_screensaver_image}, - {115, 13, 125, 100, &fox_screensaver_image}, - {114, 13, 125, 100, &fox_screensaver_image}, - {113, 13, 125, 100, &fox_screensaver_image}, - {112, 13, 125, 100, &fox_screensaver_image}, - {111, 13, 125, 100, &fox_screensaver_image}, - {110, 13, 125, 100, &fox_screensaver_image}, - {109, 13, 125, 100, &fox_screensaver_image}, - {108, 13, 125, 100, &fox_screensaver_image}, - {107, 13, 125, 100, &fox_screensaver_image}, - {106, 13, 125, 100, &fox_screensaver_image}, - {105, 13, 125, 100, &fox_screensaver_image}, - {104, 13, 125, 100, &fox_screensaver_image}, - {103, 13, 125, 100, &fox_screensaver_image}, - {102, 13, 125, 100, &fox_screensaver_image}, - {101, 13, 125, 100, &fox_screensaver_image}, - {100, 13, 125, 100, &fox_screensaver_image}, - {99, 13, 125, 100, &fox_screensaver_image}, - {98, 13, 125, 100, &fox_screensaver_image}, - {97, 13, 125, 100, &fox_screensaver_image}, - {96, 13, 125, 100, &fox_screensaver_image}, - {95, 13, 125, 100, &fox_screensaver_image}, - {94, 13, 125, 100, &fox_screensaver_image}, - {93, 13, 125, 100, &fox_screensaver_image}, - {92, 13, 125, 100, &fox_screensaver_image}, - {91, 13, 125, 100, &fox_screensaver_image}, - {90, 13, 125, 100, &fox_screensaver_image}, - {89, 13, 125, 100, &fox_screensaver_image}, - {88, 13, 125, 100, &fox_screensaver_image}, - {87, 13, 125, 100, &fox_screensaver_image}, - {86, 13, 125, 100, &fox_screensaver_image}, - {85, 13, 125, 100, &fox_screensaver_image}, - {84, 13, 125, 100, &fox_screensaver_image}, - {83, 13, 125, 100, &fox_screensaver_image}, - {82, 13, 125, 100, &fox_screensaver_image}, - {81, 13, 125, 100, &fox_screensaver_image}, - {80, 13, 125, 100, &fox_screensaver_image}, - {79, 13, 125, 100, &fox_screensaver_image}, - {78, 13, 125, 100, &fox_screensaver_image}, - {77, 13, 125, 100, &fox_screensaver_image}, - {76, 13, 125, 100, &fox_screensaver_image}, - {75, 13, 125, 100, &fox_screensaver_image}, - {74, 13, 125, 100, &fox_screensaver_image}, - {73, 13, 125, 100, &fox_screensaver_image}, - {72, 13, 125, 100, &fox_screensaver_image}, - {71, 13, 125, 100, &fox_screensaver_image}, - {70, 13, 125, 100, &fox_screensaver_image}, - {69, 13, 125, 100, &fox_screensaver_image}, - {68, 13, 125, 100, &fox_screensaver_image}, - {67, 13, 125, 100, &fox_screensaver_image}, - {66, 13, 125, 100, &fox_screensaver_image}, - {65, 13, 125, 100, &fox_screensaver_image}, - {64, 13, 125, 100, &fox_screensaver_image}, - {63, 13, 125, 100, &fox_screensaver_image}, - {62, 13, 125, 100, &fox_screensaver_image}, - {61, 13, 125, 100, &fox_screensaver_image}, - {60, 13, 125, 100, &fox_screensaver_image}, - {59, 13, 125, 100, &fox_screensaver_image}, - {58, 13, 125, 100, &fox_screensaver_image}, - {57, 13, 125, 100, &fox_screensaver_image}, - {56, 13, 125, 100, &fox_screensaver_image}, - {55, 13, 125, 100, &fox_screensaver_image}, - {54, 13, 125, 100, &fox_screensaver_image}, - {53, 13, 125, 100, &fox_screensaver_image}, - {52, 13, 125, 100, &fox_screensaver_image}, - {51, 13, 125, 100, &fox_screensaver_image}, - {50, 13, 125, 100, &fox_screensaver_image}, - {49, 13, 125, 100, &fox_screensaver_image}, - {48, 13, 125, 100, &fox_screensaver_image}, - {47, 13, 125, 100, &fox_screensaver_image}, - {46, 13, 125, 100, &fox_screensaver_image}, - {45, 13, 125, 100, &fox_screensaver_image}, - {44, 13, 125, 100, &fox_screensaver_image}, - {43, 13, 125, 100, &fox_screensaver_image}, - {42, 13, 125, 100, &fox_screensaver_image}, - {41, 13, 125, 100, &fox_screensaver_image}, - {40, 13, 125, 100, &fox_screensaver_image}, - {39, 13, 125, 100, &fox_screensaver_image}, - {38, 13, 125, 100, &fox_screensaver_image}, - {37, 13, 125, 100, &fox_screensaver_image}, - {36, 13, 125, 100, &fox_screensaver_image}, - {35, 13, 125, 100, &fox_screensaver_image}, - {34, 13, 125, 100, &fox_screensaver_image}, - {33, 13, 125, 100, &fox_screensaver_image}, - {32, 13, 125, 100, &fox_screensaver_image}, - {31, 13, 125, 100, &fox_screensaver_image}, - {30, 13, 125, 100, &fox_screensaver_image}, - {29, 13, 125, 100, &fox_screensaver_image}, - {28, 13, 125, 100, &fox_screensaver_image}, - {27, 13, 125, 100, &fox_screensaver_image}, - {26, 13, 125, 100, &fox_screensaver_image}, - {25, 13, 125, 100, &fox_screensaver_image}, - {24, 13, 125, 100, &fox_screensaver_image}, - {23, 13, 125, 100, &fox_screensaver_image}, - {22, 13, 125, 100, &fox_screensaver_image}, - {21, 13, 125, 100, &fox_screensaver_image}, - {20, 13, 125, 100, &fox_screensaver_image}, - {19, 13, 125, 100, &fox_screensaver_image}, - {18, 13, 125, 100, &fox_screensaver_image}, - {17, 13, 125, 100, &fox_screensaver_image}, - {16, 13, 125, 100, &fox_screensaver_image}, - {15, 13, 125, 100, &fox_screensaver_image}, - {14, 13, 125, 100, &fox_screensaver_image}, - {13, 13, 125, 100, &fox_screensaver_image}, - {12, 13, 125, 100, &fox_screensaver_image}, - {11, 13, 125, 100, &fox_screensaver_image}, - {10, 13, 125, 100, &fox_screensaver_image}, - {9, 13, 125, 100, &fox_screensaver_image}, - {8, 13, 125, 100, &fox_screensaver_image}, - {7, 13, 125, 100, &fox_screensaver_image}, - {6, 13, 125, 100, &fox_screensaver_image}, - {5, 13, 125, 100, &fox_screensaver_image}, - {4, 13, 125, 100, &fox_screensaver_image}, - {3, 13, 125, 100, &fox_screensaver_image}, - {2, 13, 125, 100, &fox_screensaver_image}, - {1, 13, 125, 100, &fox_screensaver_image}, - {0, 13, 125, 100, &fox_screensaver_image}, - {0, 13, 125, 100, &fox_screensaver_image}, - {1, 13, 125, 100, &fox_screensaver_image}, - {2, 13, 125, 100, &fox_screensaver_image}, - {3, 13, 125, 100, &fox_screensaver_image}, - {4, 13, 125, 100, &fox_screensaver_image}, - {5, 13, 125, 100, &fox_screensaver_image}, - {6, 13, 125, 100, &fox_screensaver_image}, - {7, 13, 125, 100, &fox_screensaver_image}, - {8, 13, 125, 100, &fox_screensaver_image}, - {9, 13, 125, 100, &fox_screensaver_image}, - {10, 13, 125, 100, &fox_screensaver_image}, - {11, 13, 125, 100, &fox_screensaver_image}, - {12, 13, 125, 100, &fox_screensaver_image}, - {13, 13, 125, 100, &fox_screensaver_image}, - {14, 13, 125, 100, &fox_screensaver_image}, - {15, 13, 125, 100, &fox_screensaver_image}, - {16, 13, 125, 100, &fox_screensaver_image}, - {17, 13, 125, 100, &fox_screensaver_image}, - {18, 13, 125, 100, &fox_screensaver_image}, - {19, 13, 125, 100, &fox_screensaver_image}, - {20, 13, 125, 100, &fox_screensaver_image}, - {21, 13, 125, 100, &fox_screensaver_image}, - {22, 13, 125, 100, &fox_screensaver_image}, - {23, 13, 125, 100, &fox_screensaver_image}, - {24, 13, 125, 100, &fox_screensaver_image}, - {25, 13, 125, 100, &fox_screensaver_image}, - {26, 13, 125, 100, &fox_screensaver_image}, - {27, 13, 125, 100, &fox_screensaver_image}, - {28, 13, 125, 100, &fox_screensaver_image}, - {29, 13, 125, 100, &fox_screensaver_image}, - {30, 13, 125, 100, &fox_screensaver_image}, - {31, 13, 125, 100, &fox_screensaver_image}, - {32, 13, 125, 100, &fox_screensaver_image}, - {33, 13, 125, 100, &fox_screensaver_image}, - {34, 13, 125, 100, &fox_screensaver_image}, - {35, 13, 125, 100, &fox_screensaver_image}, - {36, 13, 125, 100, &fox_screensaver_image}, - {37, 13, 125, 100, &fox_screensaver_image}, - {38, 13, 125, 100, &fox_screensaver_image}, - {39, 13, 125, 100, &fox_screensaver_image}, - {40, 13, 125, 100, &fox_screensaver_image}, - {41, 13, 125, 100, &fox_screensaver_image}, - {42, 13, 125, 100, &fox_screensaver_image}, - {43, 13, 125, 100, &fox_screensaver_image}, - {44, 13, 125, 100, &fox_screensaver_image}, - {45, 13, 125, 100, &fox_screensaver_image}, - {46, 13, 125, 100, &fox_screensaver_image}, - {47, 13, 125, 100, &fox_screensaver_image}, - {48, 13, 125, 100, &fox_screensaver_image}, - {49, 13, 125, 100, &fox_screensaver_image}, - {50, 13, 125, 100, &fox_screensaver_image}, - {51, 13, 125, 100, &fox_screensaver_image}, - {52, 13, 125, 100, &fox_screensaver_image}, - {53, 13, 125, 100, &fox_screensaver_image}, - {54, 13, 125, 100, &fox_screensaver_image}, - {55, 13, 125, 100, &fox_screensaver_image}, - {56, 13, 125, 100, &fox_screensaver_image}, - {57, 13, 125, 100, &fox_screensaver_image}, - {58, 13, 125, 100, &fox_screensaver_image}, - {59, 13, 125, 100, &fox_screensaver_image}, - {60, 13, 125, 100, &fox_screensaver_image}, - {61, 13, 125, 100, &fox_screensaver_image}, - {62, 13, 125, 100, &fox_screensaver_image}, - {63, 13, 125, 100, &fox_screensaver_image}, - {64, 13, 125, 100, &fox_screensaver_image}, - {65, 13, 125, 100, &fox_screensaver_image}, - {66, 13, 125, 100, &fox_screensaver_image}, - {67, 13, 125, 100, &fox_screensaver_image}, - {68, 13, 125, 100, &fox_screensaver_image}, - {69, 13, 125, 100, &fox_screensaver_image}, - {70, 13, 125, 100, &fox_screensaver_image}, - {71, 13, 125, 100, &fox_screensaver_image}, - {72, 13, 125, 100, &fox_screensaver_image}, - {73, 13, 125, 100, &fox_screensaver_image}, - {74, 13, 125, 100, &fox_screensaver_image}, - {75, 13, 125, 100, &fox_screensaver_image}, - {76, 13, 125, 100, &fox_screensaver_image}, - {77, 13, 125, 100, &fox_screensaver_image}, - {78, 13, 125, 100, &fox_screensaver_image}, - {79, 13, 125, 100, &fox_screensaver_image}, - {80, 13, 125, 100, &fox_screensaver_image}, - {81, 13, 125, 100, &fox_screensaver_image}, - {82, 13, 125, 100, &fox_screensaver_image}, - {83, 13, 125, 100, &fox_screensaver_image}, - {84, 13, 125, 100, &fox_screensaver_image}, - {85, 13, 125, 100, &fox_screensaver_image}, - {86, 13, 125, 100, &fox_screensaver_image}, - {87, 13, 125, 100, &fox_screensaver_image}, - {88, 13, 125, 100, &fox_screensaver_image}, - {89, 13, 125, 100, &fox_screensaver_image}, - {90, 13, 125, 100, &fox_screensaver_image}, - {91, 13, 125, 100, &fox_screensaver_image}, - {92, 13, 125, 100, &fox_screensaver_image}, - {93, 13, 125, 100, &fox_screensaver_image}, - {94, 13, 125, 100, &fox_screensaver_image}, - {95, 13, 125, 100, &fox_screensaver_image}, - {96, 13, 125, 100, &fox_screensaver_image}, - {97, 13, 125, 100, &fox_screensaver_image}, - {98, 13, 125, 100, &fox_screensaver_image}, - {99, 13, 125, 100, &fox_screensaver_image}, - {100, 13, 125, 100, &fox_screensaver_image}, - {101, 13, 125, 100, &fox_screensaver_image}, - {102, 13, 125, 100, &fox_screensaver_image}, - {103, 13, 125, 100, &fox_screensaver_image}, - {104, 13, 125, 100, &fox_screensaver_image}, - {105, 13, 125, 100, &fox_screensaver_image}, - {106, 13, 125, 100, &fox_screensaver_image}, - {107, 13, 125, 100, &fox_screensaver_image}, - {108, 13, 125, 100, &fox_screensaver_image}, - {109, 13, 125, 100, &fox_screensaver_image}, - {110, 13, 125, 100, &fox_screensaver_image}, - {111, 13, 125, 100, &fox_screensaver_image}, - {112, 13, 125, 100, &fox_screensaver_image}, - {113, 13, 125, 100, &fox_screensaver_image}, - {114, 13, 125, 100, &fox_screensaver_image}, - {115, 13, 125, 100, &fox_screensaver_image}, - }}; - -VariantInfo fox_svi __attribute__((section("variant_info"))) = { - .version = 1, - .name = "FOX", - .logo = &fox_logo, - .logo_reversed = &fox_logo_reversed, - .screensaver_timeout = ONE_SEC * 60 * 10, - .screensaver = &fox_screensaver}; diff --git a/tools/variant/kaspersky.c b/tools/variant/kaspersky.c deleted file mode 100644 index e019e13b8..000000000 --- a/tools/variant/kaspersky.c +++ /dev/null @@ -1,497 +0,0 @@ -/* - * This file is part of the KeepKey project. - * - * Copyright (C) 2018 KeepKey LLC - * - * This library is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this library. If not, see . - */ - -#include "keepkey/board/variant.h" - -#include "keepkey/board/timer.h" - -const uint8_t kaspersky_logo_data[3548] = { - 0x34, 0x0, 0xfd, 0x8b, 0x9d, 0x8, 0x4a, 0x0, 0xfd, 0x51, 0xc5, 0x1b, - 0x77, 0x0, 0xff, 0x5f, 0x2, 0xff, 0xfe, 0xcb, 0x1d, 0x48, 0x0, 0xfb, - 0x2c, 0xf6, 0xff, 0xe8, 0x3e, 0x75, 0x0, 0xfe, 0x28, 0xf4, 0x3, 0xff, - 0xfe, 0xeb, 0x41, 0x46, 0x0, 0xfe, 0x9, 0xd5, 0x3, 0xff, 0xfe, 0xfb, - 0x6f, 0x73, 0x0, 0xfe, 0x1, 0xc4, 0x4, 0xff, 0xfe, 0xfd, 0x5a, 0x46, - 0x0, 0xff, 0x88, 0x5, 0xff, 0xff, 0x94, 0x73, 0x0, 0xff, 0x5e, 0x5, - 0xff, 0xff, 0x79, 0x46, 0x0, 0xfe, 0x27, 0xfa, 0x4, 0xff, 0xfe, 0xb4, - 0x2, 0x72, 0x0, 0xfe, 0x6, 0xe4, 0x4, 0xff, 0xfe, 0xba, 0x1, 0x46, - 0x0, 0xff, 0xae, 0x4, 0xff, 0xfe, 0xe8, 0x10, 0x65, 0x0, 0xff, 0x5, - 0xd, 0x0, 0xff, 0x62, 0x4, 0xff, 0xfe, 0xf7, 0x21, 0x46, 0x0, 0xfe, - 0x24, 0xfe, 0x4, 0xff, 0xff, 0x54, 0x44, 0x0, 0x5, 0x20, 0xff, 0x6, - 0x8, 0x0, 0xff, 0x7, 0x5, 0x20, 0xff, 0x1c, 0xc, 0x0, 0xfe, 0x9, - 0xa1, 0xd, 0x0, 0xff, 0xc5, 0x4, 0xff, 0xff, 0x91, 0x8, 0x0, 0xff, - 0x8, 0x6, 0x20, 0xfd, 0x1b, 0x10, 0x1, 0xb, 0x0, 0xff, 0x1c, 0xf, - 0x20, 0xff, 0xa, 0x3, 0x0, 0xff, 0x1a, 0x6, 0x20, 0xfe, 0x12, 0x9, - 0xd, 0x0, 0xff, 0x88, 0x4, 0xff, 0xff, 0xca, 0x9, 0x0, 0x5, 0x20, - 0xff, 0x6, 0x8, 0x0, 0xff, 0x6, 0x5, 0x20, 0xfe, 0x1c, 0x1e, 0x4, - 0x20, 0xff, 0x9, 0xb, 0x0, 0xff, 0x8, 0x4, 0x20, 0xff, 0x1e, 0xa, - 0x0, 0xfe, 0x15, 0x11, 0x4, 0x0, 0x5, 0xff, 0xff, 0x30, 0x8, 0x0, - 0xff, 0x9f, 0x5, 0xff, 0xff, 0x7c, 0xc, 0x0, 0xfd, 0x69, 0xff, 0x34, - 0xb, 0x0, 0xfe, 0x19, 0xfe, 0x4, 0xff, 0xff, 0x23, 0x8, 0x0, 0xff, - 0x40, 0x8, 0xff, 0xfb, 0xfa, 0xd6, 0xa1, 0x54, 0x6, 0x7, 0x0, 0xff, - 0xe0, 0xf, 0xff, 0xff, 0x50, 0x3, 0x0, 0xff, 0xd0, 0x8, 0xff, 0xfc, - 0xe9, 0xbd, 0x78, 0x22, 0x9, 0x0, 0xff, 0xda, 0x4, 0xff, 0xff, 0x60, - 0x9, 0x0, 0x5, 0xff, 0xff, 0x30, 0x8, 0x0, 0xff, 0x98, 0x5, 0xff, - 0xfe, 0x84, 0xa1, 0x4, 0xff, 0xff, 0x99, 0xb, 0x0, 0xff, 0x98, 0x4, - 0xff, 0xff, 0xa4, 0x7, 0x0, 0xfd, 0x13, 0x96, 0xee, 0x2, 0xff, 0xfc, - 0xe8, 0x8b, 0xe, 0x0, 0x5, 0xff, 0xff, 0x30, 0x7, 0x0, 0xff, 0x54, - 0x5, 0xff, 0xfe, 0xc5, 0x3, 0xb, 0x0, 0xfc, 0x4, 0xde, 0xff, 0xac, - 0xb, 0x0, 0xff, 0x58, 0x4, 0xff, 0xff, 0xd1, 0x9, 0x0, 0xff, 0x40, - 0xc, 0xff, 0xfe, 0xe2, 0x5a, 0x6, 0x0, 0xff, 0xe0, 0xf, 0xff, 0xff, - 0x50, 0x3, 0x0, 0xff, 0xd0, 0xb, 0xff, 0xfd, 0xfc, 0xa1, 0x15, 0x6, - 0x0, 0xff, 0x1a, 0x4, 0xff, 0xfe, 0xfe, 0x11, 0x9, 0x0, 0x5, 0xff, - 0xff, 0x30, 0x7, 0x0, 0xff, 0x4d, 0x5, 0xff, 0xfc, 0xca, 0x5, 0x19, - 0xf3, 0x3, 0xff, 0xfe, 0xfe, 0x31, 0x9, 0x0, 0xfe, 0x30, 0xfd, 0x3, - 0xff, 0xfe, 0xf3, 0x1a, 0x6, 0x0, 0xfe, 0x12, 0xdb, 0x6, 0xff, 0xfe, - 0xd0, 0xd, 0x5, 0xff, 0xff, 0x30, 0x6, 0x0, 0xfe, 0x1c, 0xee, 0x4, - 0xff, 0xfe, 0xf2, 0x20, 0xc, 0x0, 0xff, 0x5b, 0x2, 0xff, 0xfe, 0xfe, - 0x28, 0xa, 0x0, 0xff, 0x86, 0x4, 0xff, 0xff, 0x9b, 0x9, 0x0, 0xff, - 0x40, 0xe, 0xff, 0xfe, 0x9c, 0x3, 0x4, 0x0, 0xff, 0xe0, 0xf, 0xff, - 0xff, 0x50, 0x3, 0x0, 0xff, 0xd0, 0xd, 0xff, 0xfe, 0xe5, 0x2d, 0x5, - 0x0, 0xff, 0x49, 0x4, 0xff, 0xff, 0xd7, 0xa, 0x0, 0x5, 0xff, 0xff, - 0x30, 0x6, 0x0, 0xfe, 0x17, 0xeb, 0x4, 0xff, 0xfe, 0xf4, 0x24, 0x2, - 0x0, 0xff, 0x76, 0x4, 0xff, 0xfe, 0xc3, 0x1, 0x7, 0x0, 0xfe, 0x1, - 0xc2, 0x4, 0xff, 0xff, 0x78, 0x7, 0x0, 0xff, 0x96, 0x3, 0xff, 0xfe, - 0xd1, 0xd4, 0x3, 0xff, 0xff, 0x88, 0x5, 0xff, 0xff, 0x30, 0x5, 0x0, - 0xfe, 0x2, 0xbd, 0x5, 0xff, 0xff, 0x5c, 0xc, 0x0, 0xfe, 0x1, 0xd3, - 0x3, 0xff, 0xff, 0x9e, 0xa, 0x0, 0xff, 0xa2, 0x4, 0xff, 0xff, 0x7d, - 0x9, 0x0, 0xff, 0x40, 0xf, 0xff, 0xff, 0x8d, 0x4, 0x0, 0xff, 0xe0, - 0xf, 0xff, 0xff, 0x50, 0x3, 0x0, 0xff, 0xd0, 0xe, 0xff, 0xfe, 0xe7, - 0x1b, 0x4, 0x0, 0xff, 0x66, 0x4, 0xff, 0xff, 0xba, 0xa, 0x0, 0x5, - 0xff, 0xff, 0x30, 0x5, 0x0, 0xfe, 0x1, 0xb7, 0x5, 0xff, 0xff, 0x64, - 0x3, 0x0, 0xfe, 0x6, 0xda, 0x4, 0xff, 0xff, 0x5a, 0x7, 0x0, 0xff, - 0x58, 0x4, 0xff, 0xfe, 0xdc, 0x7, 0x7, 0x0, 0xfc, 0xee, 0xff, 0xfc, - 0x46, 0x2, 0x0, 0xfc, 0x4f, 0xfe, 0xff, 0xe4, 0x5, 0xff, 0xff, 0x30, - 0x5, 0x0, 0xff, 0x75, 0x5, 0xff, 0xff, 0xa7, 0xd, 0x0, 0xff, 0x4c, - 0x4, 0xff, 0xfe, 0xfa, 0x1e, 0x9, 0x0, 0xff, 0xa2, 0x4, 0xff, 0xff, - 0x80, 0x9, 0x0, 0xff, 0x40, 0x10, 0xff, 0xff, 0x3c, 0x3, 0x0, 0xff, - 0xe0, 0xf, 0xff, 0xff, 0x50, 0x3, 0x0, 0xff, 0xd0, 0xf, 0xff, 0xff, - 0xac, 0x4, 0x0, 0xff, 0x6f, 0x4, 0xff, 0xff, 0xbd, 0xa, 0x0, 0x5, - 0xff, 0xff, 0x30, 0x5, 0x0, 0xff, 0x6d, 0x5, 0xff, 0xff, 0xae, 0x5, - 0x0, 0xff, 0x4a, 0x4, 0xff, 0xfe, 0xe5, 0xb, 0x5, 0x0, 0xfe, 0xa, - 0xe3, 0x4, 0xff, 0xff, 0x4d, 0x7, 0x0, 0xff, 0xd, 0x2, 0xff, 0xff, - 0xb6, 0x4, 0x0, 0xff, 0xbf, 0x7, 0xff, 0xff, 0x30, 0x4, 0x0, 0xfe, - 0x31, 0xf9, 0x4, 0xff, 0xfe, 0xe1, 0x10, 0xd, 0x0, 0xff, 0xc6, 0x5, - 0xff, 0xff, 0x90, 0x9, 0x0, 0xff, 0x9b, 0x4, 0xff, 0xff, 0x9b, 0x9, - 0x0, 0xff, 0x40, 0x4, 0xff, 0xf9, 0xf0, 0x0, 0x5, 0x14, 0x32, 0x6f, - 0xd9, 0x5, 0xff, 0xff, 0xb3, 0x3, 0x0, 0xff, 0xe0, 0x4, 0xff, 0xff, - 0x50, 0xe, 0x0, 0xff, 0xd0, 0x4, 0xff, 0xf9, 0x60, 0x0, 0xd, 0x21, - 0x50, 0xa4, 0xfd, 0x5, 0xff, 0xff, 0x29, 0x3, 0x0, 0xff, 0x5c, 0x4, - 0xff, 0xff, 0xd8, 0xa, 0x0, 0x5, 0xff, 0xff, 0x30, 0x4, 0x0, 0xfe, - 0x2b, 0xf8, 0x4, 0xff, 0xfe, 0xe5, 0x13, 0x6, 0x0, 0xff, 0xb6, 0x4, - 0xff, 0xff, 0x86, 0x5, 0x0, 0xff, 0x83, 0x4, 0xff, 0xff, 0xb7, 0x9, - 0x0, 0xfd, 0xee, 0xff, 0xb9, 0x4, 0x0, 0xfd, 0xbf, 0xff, 0xe5, 0x5, - 0xff, 0xff, 0x30, 0x3, 0x0, 0xfe, 0x9, 0xd6, 0x4, 0xff, 0xfe, 0xfd, - 0x3f, 0xd, 0x0, 0xff, 0x3e, 0x6, 0xff, 0xfe, 0xf4, 0x14, 0x8, 0x0, - 0xff, 0x7a, 0x4, 0xff, 0xff, 0xd1, 0x9, 0x0, 0xff, 0x40, 0x4, 0xff, - 0xff, 0xf0, 0x5, 0x0, 0xfe, 0x8, 0xb6, 0x4, 0xff, 0xfe, 0xfb, 0xc, - 0x2, 0x0, 0xff, 0xe0, 0x4, 0xff, 0xff, 0x50, 0xe, 0x0, 0xff, 0xd0, - 0x4, 0xff, 0xff, 0x60, 0x5, 0x0, 0xfe, 0x4c, 0xfd, 0x4, 0xff, 0xff, - 0x7a, 0x3, 0x0, 0xff, 0x3f, 0x4, 0xff, 0xfe, 0xfc, 0x12, 0x9, 0x0, - 0x5, 0xff, 0xff, 0x30, 0x3, 0x0, 0xfe, 0x7, 0xd1, 0x5, 0xff, 0xff, - 0x44, 0x7, 0x0, 0xfe, 0x25, 0xfa, 0x3, 0xff, 0xfe, 0xf8, 0x22, 0x3, - 0x0, 0xfe, 0x21, 0xf8, 0x3, 0xff, 0xfe, 0xfa, 0x27, 0x9, 0x0, 0xfc, - 0x85, 0xff, 0xfd, 0x50, 0x2, 0x0, 0xfc, 0x54, 0xfe, 0xff, 0x7a, 0x5, - 0xff, 0xff, 0x30, 0x3, 0x0, 0xff, 0x96, 0x5, 0xff, 0xff, 0x87, 0xe, - 0x0, 0xff, 0xb8, 0x7, 0xff, 0xff, 0x82, 0x8, 0x0, 0xff, 0x42, 0x5, - 0xff, 0xff, 0x27, 0x8, 0x0, 0xff, 0x40, 0x4, 0xff, 0xff, 0xf0, 0x6, - 0x0, 0xfe, 0x20, 0xfe, 0x4, 0xff, 0xff, 0x3b, 0x2, 0x0, 0xff, 0xe0, - 0x4, 0xff, 0xff, 0x50, 0xe, 0x0, 0xff, 0xd0, 0x4, 0xff, 0xff, 0x60, - 0x6, 0x0, 0xff, 0xab, 0x4, 0xff, 0xff, 0xb0, 0x3, 0x0, 0xfe, 0xb, - 0xfa, 0x4, 0xff, 0xff, 0x66, 0x9, 0x0, 0x5, 0xff, 0xff, 0x30, 0x3, - 0x0, 0xff, 0x8e, 0x5, 0xff, 0xff, 0x8d, 0x9, 0x0, 0xff, 0x89, 0x4, - 0xff, 0xff, 0xb1, 0x3, 0x0, 0xff, 0xaf, 0x4, 0xff, 0xff, 0x8c, 0x5, - 0x0, 0xff, 0xd2, 0x4, 0xe0, 0xff, 0xe3, 0x3, 0xff, 0xfe, 0xdb, 0xdf, - 0x2, 0xff, 0xfe, 0xfb, 0x85, 0x5, 0xff, 0xff, 0x30, 0x2, 0x0, 0xff, - 0x4b, 0x5, 0xff, 0xfe, 0xcc, 0x5, 0xd, 0x0, 0xff, 0x31, 0x8, 0xff, - 0xfe, 0xee, 0xc, 0x7, 0x0, 0xfe, 0x7, 0xef, 0x4, 0xff, 0xff, 0x9c, - 0x8, 0x0, 0xff, 0x40, 0x4, 0xff, 0xff, 0xf0, 0x7, 0x0, 0xff, 0xe6, - 0x4, 0xff, 0xff, 0x52, 0x2, 0x0, 0xff, 0xe0, 0x4, 0xff, 0xff, 0x50, - 0xe, 0x0, 0xff, 0xd0, 0x4, 0xff, 0xff, 0x60, 0x6, 0x0, 0xff, 0x72, - 0x4, 0xff, 0xff, 0xc6, 0x4, 0x0, 0xff, 0xba, 0x4, 0xff, 0xfe, 0xd6, - 0x3, 0x8, 0x0, 0x5, 0xff, 0xff, 0x30, 0x2, 0x0, 0xff, 0x45, 0x5, - 0xff, 0xfe, 0xd1, 0x7, 0x9, 0x0, 0xfe, 0xd, 0xe7, 0x4, 0xff, 0xfd, - 0x47, 0x0, 0x44, 0x4, 0xff, 0xfe, 0xe9, 0xe, 0x5, 0x0, 0xff, 0xf0, - 0xd, 0xff, 0xff, 0xb0, 0x5, 0xff, 0xfc, 0x30, 0x0, 0x16, 0xea, 0x4, - 0xff, 0xfe, 0xf5, 0x26, 0xe, 0x0, 0xff, 0xa8, 0x4, 0xff, 0xff, 0xfd, - 0x4, 0xff, 0xff, 0x74, 0x8, 0x0, 0xff, 0x8f, 0x4, 0xff, 0xfe, 0xfd, - 0x35, 0x7, 0x0, 0xff, 0x40, 0x4, 0xff, 0xff, 0xf0, 0x7, 0x0, 0xff, - 0xe9, 0x4, 0xff, 0xff, 0x52, 0x2, 0x0, 0xff, 0xe0, 0x4, 0xff, 0xff, - 0x50, 0x6, 0x0, 0xff, 0x14, 0x7, 0x0, 0xff, 0xd0, 0x4, 0xff, 0xff, - 0x60, 0x6, 0x0, 0xff, 0x75, 0x4, 0xff, 0xff, 0xc6, 0x4, 0x0, 0xff, - 0x51, 0x5, 0xff, 0xff, 0x6f, 0x8, 0x0, 0x5, 0xff, 0xfc, 0x30, 0x0, - 0x13, 0xe5, 0x4, 0xff, 0xfe, 0xf8, 0x2b, 0xb, 0x0, 0xff, 0x5f, 0x4, - 0xff, 0xfd, 0xd7, 0x9, 0xd5, 0x4, 0xff, 0xff, 0x60, 0x6, 0x0, 0xff, - 0xe1, 0xd, 0xf0, 0xff, 0xa5, 0x5, 0xff, 0xfd, 0x30, 0x1, 0xb5, 0x5, - 0xff, 0xff, 0x66, 0xe, 0x0, 0xfe, 0x24, 0xfe, 0x3, 0xff, 0xfe, 0xfa, - 0x69, 0x4, 0xff, 0xfe, 0xe6, 0x6, 0x7, 0x0, 0xfe, 0x1b, 0xf4, 0x4, - 0xff, 0xfe, 0xd1, 0x5, 0x6, 0x0, 0xff, 0x40, 0x4, 0xff, 0xff, 0xf0, - 0x6, 0x0, 0xff, 0x32, 0x5, 0xff, 0xff, 0x36, 0x2, 0x0, 0xff, 0xe0, - 0x4, 0xff, 0xff, 0x50, 0x4, 0x0, 0xfd, 0x31, 0xb0, 0xaf, 0x7, 0x0, - 0xff, 0xd0, 0x4, 0xff, 0xff, 0x60, 0x6, 0x0, 0xff, 0xbe, 0x4, 0xff, - 0xff, 0xaa, 0x4, 0x0, 0xfe, 0x2, 0xcf, 0x4, 0xff, 0xfe, 0xf4, 0x21, - 0x7, 0x0, 0x5, 0xff, 0xfd, 0x30, 0x0, 0xae, 0x5, 0xff, 0xff, 0x6c, - 0xc, 0x0, 0xfe, 0x1, 0xc7, 0x4, 0xff, 0xff, 0xc9, 0x4, 0xff, 0xfe, - 0xc9, 0x1, 0x15, 0x0, 0x5, 0xff, 0xfe, 0x30, 0x6a, 0x5, 0xff, 0xff, - 0xb1, 0xf, 0x0, 0xff, 0x9a, 0x4, 0xff, 0xfd, 0x9d, 0x1, 0xd2, 0x4, - 0xff, 0xff, 0x65, 0x8, 0x0, 0xff, 0x77, 0x5, 0xff, 0xff, 0x80, 0x6, - 0x0, 0xff, 0x40, 0x4, 0xff, 0xff, 0xf0, 0x5, 0x0, 0xfe, 0x16, 0xd2, - 0x4, 0xff, 0xfe, 0xf4, 0x8, 0x2, 0x0, 0xff, 0xe0, 0x4, 0xff, 0xff, - 0x50, 0x2, 0x0, 0xfe, 0x37, 0xb0, 0x2, 0xff, 0xff, 0xb0, 0x7, 0x0, - 0xff, 0xd0, 0x4, 0xff, 0xff, 0x60, 0x5, 0x0, 0xff, 0x73, 0x5, 0xff, - 0xff, 0x70, 0x5, 0x0, 0xff, 0x3c, 0x5, 0xff, 0xfe, 0xbe, 0x1, 0x6, - 0x0, 0x5, 0xff, 0xfe, 0x30, 0x64, 0x5, 0xff, 0xfe, 0xb7, 0x1, 0xd, - 0x0, 0xfe, 0x35, 0xfe, 0x8, 0xff, 0xff, 0x37, 0xc, 0x0, 0xff, 0x24, - 0x8, 0x30, 0xff, 0x21, 0x5, 0xff, 0xfe, 0x5a, 0xf7, 0x4, 0xff, 0xfe, - 0xe7, 0x14, 0xe, 0x0, 0xfe, 0x1a, 0xfa, 0x3, 0xff, 0xfc, 0xfe, 0x27, - 0x0, 0x5a, 0x4, 0xff, 0xfe, 0xdc, 0x2, 0x7, 0x0, 0xfe, 0x5, 0xd0, - 0x4, 0xff, 0xfe, 0xf7, 0x1f, 0x5, 0x0, 0xff, 0x40, 0x4, 0xff, 0xff, - 0xf0, 0x3, 0x0, 0xfd, 0x17, 0x71, 0xe7, 0x5, 0xff, 0xff, 0x9e, 0x3, - 0x0, 0xff, 0xe0, 0x4, 0xff, 0xfd, 0x50, 0x38, 0xb8, 0x4, 0xff, 0xff, - 0xb0, 0x7, 0x0, 0xff, 0xd0, 0x4, 0xff, 0xff, 0x60, 0x2, 0x0, 0xfd, - 0x3, 0x42, 0xb3, 0x5, 0xff, 0xfe, 0xfa, 0x19, 0x6, 0x0, 0xff, 0x98, - 0x5, 0xff, 0xff, 0x54, 0x6, 0x0, 0x5, 0xff, 0xfe, 0x55, 0xf4, 0x4, - 0xff, 0xfe, 0xeb, 0x17, 0xf, 0x0, 0xff, 0x9d, 0x7, 0xff, 0xff, 0xa0, - 0xd, 0x0, 0xff, 0xc0, 0x8, 0xff, 0xff, 0xb0, 0x5, 0xff, 0xff, 0xb6, - 0x5, 0xff, 0xff, 0x96, 0xf, 0x0, 0xff, 0x8c, 0x4, 0xff, 0xff, 0xac, - 0x2, 0x0, 0xfe, 0x4, 0xdd, 0x4, 0xff, 0xff, 0x57, 0x8, 0x0, 0xff, - 0x38, 0x5, 0xff, 0xff, 0x9f, 0x5, 0x0, 0xff, 0x40, 0x4, 0xff, 0xfc, - 0xf0, 0x7c, 0xc1, 0xdf, 0x7, 0xff, 0xfe, 0xf7, 0x23, 0x3, 0x0, 0xff, - 0xe0, 0x4, 0xff, 0xfe, 0x72, 0xe2, 0x5, 0xff, 0xff, 0xb0, 0x7, 0x0, - 0xff, 0xd0, 0x4, 0xff, 0xfc, 0x8b, 0xb8, 0xcd, 0xf6, 0x7, 0xff, 0xff, - 0x8e, 0x7, 0x0, 0xfe, 0xf, 0xea, 0x4, 0xff, 0xfe, 0xdc, 0x2, 0x5, - 0x0, 0x5, 0xff, 0xff, 0xaf, 0x5, 0xff, 0xff, 0x9c, 0x10, 0x0, 0xfe, - 0x17, 0xf1, 0x5, 0xff, 0xfe, 0xf2, 0x17, 0xd, 0x0, 0xff, 0xc0, 0x8, - 0xff, 0xff, 0xb0, 0x5, 0xff, 0xfe, 0x3c, 0xda, 0x4, 0xff, 0xfe, 0xfc, - 0x3a, 0xd, 0x0, 0xfe, 0x12, 0xf4, 0x4, 0xff, 0xff, 0x33, 0x3, 0x0, - 0xff, 0x68, 0x4, 0xff, 0xfe, 0xcf, 0x1, 0x8, 0x0, 0xff, 0xa3, 0x4, - 0xff, 0xfe, 0xfa, 0x1a, 0x4, 0x0, 0xff, 0x40, 0x4, 0xff, 0xfd, 0xf0, - 0x27, 0xf5, 0x8, 0xff, 0xff, 0x65, 0x4, 0x0, 0xff, 0xe0, 0x4, 0xff, - 0xfc, 0x50, 0x6, 0x60, 0xdc, 0x3, 0xff, 0xff, 0xb0, 0x7, 0x0, 0xff, - 0xd0, 0x4, 0xff, 0xfe, 0x60, 0xa8, 0x8, 0xff, 0xfe, 0xce, 0xa, 0x8, - 0x0, 0xff, 0x6a, 0x5, 0xff, 0xff, 0x50, 0x5, 0x0, 0x5, 0xff, 0xfe, - 0x39, 0xd6, 0x4, 0xff, 0xfe, 0xfd, 0x3f, 0x10, 0x0, 0xff, 0x72, 0x5, - 0xff, 0xff, 0x74, 0xe, 0x0, 0xf6, 0x7e, 0xfc, 0xff, 0xfa, 0xb6, 0xb9, - 0xfc, 0xff, 0xfa, 0x73, 0x5, 0xff, 0xfd, 0x30, 0x35, 0xfb, 0x4, 0xff, - 0xfe, 0xde, 0xd, 0xc, 0x0, 0xff, 0x7e, 0x4, 0xff, 0xff, 0xba, 0x4, - 0x0, 0xfe, 0x9, 0xe7, 0x4, 0xff, 0xff, 0x48, 0x8, 0x0, 0xfe, 0x24, - 0xfc, 0x4, 0xff, 0xff, 0x78, 0x4, 0x0, 0xff, 0x40, 0x4, 0xff, 0xfd, - 0xf0, 0x0, 0x66, 0x6, 0xff, 0xfe, 0xfd, 0x72, 0x5, 0x0, 0xff, 0xe0, - 0x4, 0xff, 0xff, 0x50, 0x2, 0x0, 0xfb, 0x4, 0x60, 0xdc, 0xff, 0xb0, - 0x7, 0x0, 0xff, 0xd0, 0x4, 0xff, 0xfd, 0x60, 0x10, 0xe2, 0x6, 0xff, - 0xfe, 0xce, 0x15, 0x9, 0x0, 0xfe, 0x6, 0xdd, 0x4, 0xff, 0xff, 0xb4, - 0x5, 0x0, 0x5, 0xff, 0xfd, 0x30, 0x2f, 0xf9, 0x4, 0xff, 0xfe, 0xe2, - 0x10, 0xf, 0x0, 0xfe, 0x5, 0xd7, 0x3, 0xff, 0xfe, 0xd9, 0x6, 0xe, - 0x0, 0xfc, 0x91, 0xff, 0xfa, 0x34, 0x2, 0x0, 0xfc, 0x3a, 0xfa, 0xff, - 0x8e, 0x5, 0xff, 0xfd, 0x30, 0x0, 0x7a, 0x5, 0xff, 0xff, 0xa1, 0xb, - 0x0, 0xfe, 0xc, 0xec, 0x4, 0xff, 0xff, 0x41, 0x5, 0x0, 0xff, 0x77, - 0x4, 0xff, 0xff, 0xc1, 0x9, 0x0, 0xff, 0xae, 0x4, 0xff, 0xff, 0xcb, - 0x4, 0x0, 0xff, 0x40, 0x4, 0xff, 0xff, 0xf0, 0x2, 0x0, 0xff, 0xb1, - 0x4, 0xff, 0xfe, 0xd7, 0x40, 0x6, 0x0, 0xff, 0xe0, 0x4, 0xff, 0xff, - 0x50, 0x4, 0x0, 0xfd, 0x4, 0x5f, 0x87, 0x7, 0x0, 0xff, 0xd0, 0x4, - 0xff, 0xfc, 0x60, 0x0, 0x3f, 0xfd, 0x4, 0xff, 0xfe, 0xf3, 0x10, 0xb, - 0x0, 0xff, 0x71, 0x4, 0xff, 0xfe, 0xf9, 0xd, 0x4, 0x0, 0x5, 0xff, - 0xfd, 0x30, 0x0, 0x74, 0x5, 0xff, 0xff, 0xa8, 0x10, 0x0, 0xff, 0x47, - 0x3, 0xff, 0xff, 0x49, 0xf, 0x0, 0xfd, 0xf1, 0xff, 0xb4, 0x4, 0x0, - 0xfd, 0xbb, 0xff, 0xec, 0x5, 0xff, 0xfc, 0x30, 0x0, 0x3, 0xc3, 0x5, - 0xff, 0xff, 0x56, 0xa, 0x0, 0xff, 0x70, 0x4, 0xff, 0xff, 0xcb, 0x6, - 0x40, 0xfe, 0x4a, 0xf0, 0x4, 0xff, 0xff, 0x3a, 0x8, 0x0, 0xff, 0x4d, - 0x4, 0xff, 0xfe, 0xfd, 0xb, 0x3, 0x0, 0xff, 0x40, 0x4, 0xff, 0xff, - 0xf0, 0x2, 0x0, 0xfa, 0x14, 0xe7, 0xf5, 0xb0, 0x52, 0x4, 0x7, 0x0, - 0xff, 0xe0, 0x4, 0xff, 0xff, 0x50, 0xe, 0x0, 0xff, 0xd0, 0x4, 0xff, - 0xff, 0x60, 0x2, 0x0, 0xff, 0x87, 0x5, 0xff, 0xff, 0x94, 0xb, 0x0, - 0xfe, 0x14, 0xfd, 0x4, 0xff, 0xff, 0x45, 0x4, 0x0, 0x5, 0xff, 0xfc, - 0x30, 0x0, 0x1, 0xbd, 0x5, 0xff, 0xff, 0x5d, 0x10, 0x0, 0xfd, 0xb1, - 0xff, 0xb3, 0xf, 0x0, 0xff, 0x8, 0x2, 0xff, 0xff, 0xb9, 0x4, 0x0, - 0xff, 0xc1, 0x7, 0xff, 0xff, 0x30, 0x2, 0x0, 0xfe, 0x1f, 0xf1, 0x4, - 0xff, 0xfe, 0xef, 0x1d, 0x8, 0x0, 0xfe, 0x6, 0xe2, 0x4, 0xff, 0xfe, - 0x53, 0xdc, 0x5, 0xff, 0xfe, 0xad, 0x85, 0x4, 0xff, 0xff, 0xb3, 0x8, - 0x0, 0xfe, 0x9, 0xfb, 0x4, 0xff, 0xff, 0x36, 0x3, 0x0, 0xff, 0x40, - 0x4, 0xff, 0xff, 0xf0, 0x3, 0x0, 0xfe, 0x14, 0x4, 0xa, 0x0, 0xff, - 0xe0, 0x4, 0xff, 0xff, 0x50, 0xe, 0x0, 0xff, 0xd0, 0x4, 0xff, 0xff, - 0x60, 0x2, 0x0, 0xfe, 0x5, 0xcc, 0x5, 0xff, 0xff, 0x4b, 0xb, 0x0, - 0xff, 0xc6, 0x4, 0xff, 0xff, 0x73, 0x4, 0x0, 0x5, 0xff, 0xff, 0x30, - 0x2, 0x0, 0xfe, 0x1b, 0xed, 0x4, 0xff, 0xfe, 0xf2, 0x21, 0xf, 0x0, - 0xfd, 0x23, 0xf1, 0x24, 0x10, 0x0, 0xfc, 0xe5, 0xff, 0xfe, 0x5d, 0x2, - 0x1, 0xff, 0x65, 0x2, 0xff, 0xff, 0xe1, 0x5, 0xff, 0xff, 0x30, 0x3, - 0x0, 0xff, 0x5a, 0x5, 0xff, 0xfe, 0xbf, 0x2, 0x7, 0x0, 0xff, 0x62, - 0x4, 0xff, 0xfd, 0xd6, 0x1, 0x60, 0x4, 0xff, 0xfc, 0xfe, 0x2a, 0x15, - 0xf7, 0x4, 0xff, 0xff, 0x2d, 0x8, 0x0, 0xff, 0xd0, 0x4, 0xff, 0xff, - 0x4f, 0x3, 0x0, 0xff, 0x40, 0x4, 0xff, 0xff, 0xf0, 0xf, 0x0, 0xff, - 0xe0, 0x4, 0xff, 0xff, 0x50, 0xe, 0x0, 0xff, 0xd0, 0x4, 0xff, 0xff, - 0x60, 0x3, 0x0, 0xfe, 0x27, 0xf5, 0x4, 0xff, 0xfe, 0xe9, 0x16, 0xa, - 0x0, 0xff, 0x95, 0x4, 0xff, 0xff, 0x8b, 0x4, 0x0, 0x5, 0xff, 0xff, - 0x30, 0x3, 0x0, 0xff, 0x53, 0x5, 0xff, 0xfe, 0xc5, 0x3, 0xf, 0x0, - 0xff, 0x41, 0x11, 0x0, 0xff, 0x84, 0x3, 0xff, 0xfe, 0xe4, 0xe5, 0x3, - 0xff, 0xff, 0x84, 0x5, 0xff, 0xff, 0x30, 0x4, 0x0, 0xff, 0xa5, 0x5, - 0xff, 0xff, 0x77, 0x6, 0x0, 0xfe, 0x2, 0xd8, 0x4, 0xff, 0xfc, 0x5e, - 0x0, 0x4, 0xdc, 0x3, 0xff, 0xff, 0xa8, 0x2, 0x0, 0xff, 0x93, 0x4, - 0xff, 0xff, 0xa5, 0x8, 0x0, 0xff, 0xbc, 0x4, 0xff, 0xff, 0x54, 0x3, - 0x0, 0xff, 0x40, 0x4, 0xff, 0xff, 0xf0, 0xf, 0x0, 0xff, 0xe0, 0x4, - 0xff, 0xff, 0x50, 0xe, 0x0, 0xff, 0xd0, 0x4, 0xff, 0xff, 0x60, 0x4, - 0x0, 0xff, 0x67, 0x5, 0xff, 0xfe, 0xb4, 0x1, 0x9, 0x0, 0xff, 0x80, - 0x4, 0xff, 0xff, 0x90, 0x4, 0x0, 0x5, 0xff, 0xff, 0x30, 0x4, 0x0, - 0xff, 0x9d, 0x5, 0xff, 0xff, 0x7e, 0xe, 0x0, 0xfd, 0xc, 0xd8, 0xc, - 0x10, 0x0, 0xfe, 0x8, 0xc3, 0x6, 0xff, 0xfe, 0xc5, 0x9, 0x5, 0xff, - 0xff, 0x30, 0x4, 0x0, 0xfe, 0xf, 0xe0, 0x4, 0xff, 0xfe, 0xfa, 0x32, - 0x5, 0x0, 0xff, 0x54, 0x4, 0xff, 0xfe, 0xe2, 0x4, 0x2, 0x0, 0xff, - 0x5e, 0x2, 0xff, 0xfe, 0xfe, 0x2a, 0x2, 0x0, 0xfe, 0x1e, 0xfb, 0x3, - 0xff, 0xfe, 0xfc, 0x22, 0x7, 0x0, 0xff, 0xc4, 0x4, 0xff, 0xff, 0x4c, - 0x3, 0x0, 0xff, 0x40, 0x4, 0xff, 0xff, 0xf0, 0xf, 0x0, 0xff, 0xe0, - 0x4, 0xff, 0xff, 0x87, 0xa, 0x50, 0xff, 0x19, 0x3, 0x0, 0xff, 0xd0, - 0x4, 0xff, 0xff, 0x60, 0x5, 0x0, 0xff, 0xb1, 0x5, 0xff, 0xff, 0x6a, - 0x9, 0x0, 0xff, 0x86, 0x4, 0xff, 0xff, 0x8a, 0x4, 0x0, 0x5, 0xff, - 0xff, 0x30, 0x4, 0x0, 0xfe, 0xc, 0xdc, 0x4, 0xff, 0xfe, 0xfc, 0x38, - 0xd, 0x0, 0xfd, 0x78, 0xff, 0x78, 0x11, 0x0, 0xf7, 0x6, 0x78, 0xd6, - 0xfd, 0xfe, 0xd4, 0x75, 0x6, 0x0, 0x5, 0xff, 0xff, 0x30, 0x5, 0x0, - 0xfe, 0x3d, 0xfd, 0x4, 0xff, 0xfe, 0xd8, 0xa, 0x4, 0x0, 0xff, 0xcc, - 0x4, 0xff, 0xff, 0x6c, 0x3, 0x0, 0xfc, 0x2, 0xd6, 0xff, 0xa8, 0x4, - 0x0, 0xff, 0xa1, 0x4, 0xff, 0xff, 0x97, 0x6, 0x0, 0xfe, 0x1, 0xee, - 0x4, 0xff, 0xff, 0x2a, 0x3, 0x0, 0xff, 0x40, 0x4, 0xff, 0xff, 0xf0, - 0xf, 0x0, 0xff, 0xe0, 0xf, 0xff, 0xff, 0x50, 0x3, 0x0, 0xff, 0xd0, - 0x4, 0xff, 0xff, 0x60, 0x5, 0x0, 0xfe, 0x14, 0xe7, 0x4, 0xff, 0xfe, - 0xf6, 0x29, 0x8, 0x0, 0xff, 0xb3, 0x4, 0xff, 0xff, 0x67, 0x4, 0x0, - 0x5, 0xff, 0xff, 0x30, 0x5, 0x0, 0xfe, 0x37, 0xfc, 0x4, 0xff, 0xfe, - 0xdc, 0xc, 0xb, 0x0, 0xfb, 0xc, 0xec, 0xff, 0xec, 0x10, 0x13, 0x0, - 0xfe, 0x2, 0x1, 0x4, 0x0, 0x5, 0xff, 0xff, 0x30, 0x6, 0x0, 0xff, - 0x84, 0x5, 0xff, 0xff, 0x98, 0x3, 0x0, 0xff, 0x45, 0x4, 0xff, 0xfe, - 0xeb, 0x9, 0x4, 0x0, 0xfd, 0x58, 0xfc, 0x27, 0x4, 0x0, 0xfe, 0x2a, - 0xfe, 0x3, 0xff, 0xfe, 0xf7, 0x19, 0x5, 0x0, 0xff, 0x3a, 0x4, 0xff, - 0xfe, 0xf3, 0x4, 0x3, 0x0, 0xff, 0x40, 0x4, 0xff, 0xff, 0xf0, 0xf, - 0x0, 0xff, 0xe0, 0xf, 0xff, 0xff, 0x50, 0x3, 0x0, 0xff, 0xd0, 0x4, - 0xff, 0xff, 0x60, 0x6, 0x0, 0xff, 0x47, 0x5, 0xff, 0xfe, 0xcf, 0x7, - 0x6, 0x0, 0xfe, 0xa, 0xf4, 0x4, 0xff, 0xff, 0x34, 0x4, 0x0, 0x5, - 0xff, 0xff, 0x30, 0x6, 0x0, 0xff, 0x7c, 0x5, 0xff, 0xff, 0x9e, 0xb, - 0x0, 0xff, 0x7c, 0x3, 0xff, 0xff, 0x80, 0xa, 0x0, 0xff, 0xf, 0xd, - 0x10, 0xff, 0xb, 0x5, 0xff, 0xff, 0x30, 0x6, 0x0, 0xfe, 0x5, 0xca, - 0x5, 0xff, 0xff, 0x4d, 0x2, 0x0, 0xff, 0xbe, 0x4, 0xff, 0xff, 0x7a, - 0x5, 0x0, 0xfe, 0x2, 0x76, 0x6, 0x0, 0xff, 0xaf, 0x4, 0xff, 0xff, - 0x88, 0x5, 0x0, 0xff, 0xa8, 0x4, 0xff, 0xff, 0xaf, 0x4, 0x0, 0xff, - 0x40, 0x4, 0xff, 0xff, 0xf0, 0xf, 0x0, 0xff, 0xe0, 0xf, 0xff, 0xff, - 0x50, 0x3, 0x0, 0xff, 0xd0, 0x4, 0xff, 0xff, 0x60, 0x7, 0x0, 0xff, - 0x91, 0x5, 0xff, 0xff, 0x8a, 0x6, 0x0, 0xff, 0x70, 0x4, 0xff, 0xfe, - 0xea, 0x2, 0x4, 0x0, 0x5, 0xff, 0xff, 0x30, 0x6, 0x0, 0xfe, 0x3, - 0xc5, 0x5, 0xff, 0xff, 0x54, 0x9, 0x0, 0xfe, 0x10, 0xf0, 0x3, 0xff, - 0xfe, 0xf0, 0x10, 0x9, 0x0, 0xff, 0xf0, 0xd, 0xff, 0xff, 0xb0, 0x5, - 0xff, 0xff, 0x30, 0x7, 0x0, 0xfe, 0x25, 0xf4, 0x4, 0xff, 0xfd, 0xeb, - 0x17, 0x37, 0x4, 0xff, 0xfe, 0xf2, 0x10, 0xd, 0x0, 0xff, 0x37, 0x4, - 0xff, 0xfe, 0xf1, 0x10, 0x3, 0x0, 0xff, 0x3f, 0x5, 0xff, 0xff, 0x50, - 0x4, 0x0, 0xff, 0x40, 0x4, 0xff, 0xff, 0xf0, 0xf, 0x0, 0xff, 0xe0, - 0xf, 0xff, 0xff, 0x50, 0x3, 0x0, 0xff, 0xd0, 0x4, 0xff, 0xff, 0x60, - 0x7, 0x0, 0xfe, 0x8, 0xd3, 0x4, 0xff, 0xfe, 0xfe, 0x42, 0x4, 0x0, - 0xfe, 0x15, 0xeb, 0x4, 0xff, 0xff, 0x8d, 0x5, 0x0, 0x5, 0xff, 0xff, - 0x30, 0x7, 0x0, 0xfe, 0x20, 0xf2, 0x4, 0xff, 0xfe, 0xee, 0x1b, 0x8, - 0x0, 0xff, 0x80, 0x5, 0xff, 0xff, 0x80, 0x9, 0x0, 0xff, 0xf0, 0xd, - 0xff, 0xff, 0xb0, 0x5, 0xd0, 0xff, 0x27, 0x8, 0x0, 0xff, 0x5f, 0x5, - 0xd0, 0xfe, 0x87, 0x85, 0x4, 0xd0, 0xff, 0x78, 0xf, 0x0, 0xff, 0xa3, - 0x4, 0xd0, 0xff, 0x59, 0x2, 0x0, 0xfe, 0x12, 0xe0, 0x4, 0xff, 0xfe, - 0xda, 0x3, 0x4, 0x0, 0xff, 0x34, 0x4, 0xd0, 0xff, 0xc3, 0xf, 0x0, - 0xff, 0xb6, 0xf, 0xd0, 0xff, 0x41, 0x3, 0x0, 0xff, 0xa9, 0x4, 0xd0, - 0xff, 0x4e, 0x8, 0x0, 0xfe, 0x2e, 0xcf, 0x4, 0xd0, 0xfe, 0xb4, 0x5, - 0x2, 0x0, 0xfe, 0x1, 0xb4, 0x4, 0xff, 0xfe, 0xfa, 0x21, 0x5, 0x0, - 0x5, 0xd0, 0xff, 0x27, 0x8, 0x0, 0xff, 0x59, 0x5, 0xd0, 0xff, 0x8c, - 0x7, 0x0, 0xfe, 0x6, 0xc0, 0x5, 0xd0, 0xfe, 0xc0, 0x6, 0x8, 0x0, - 0xff, 0xc3, 0xd, 0xd0, 0xff, 0x8f, 0x31, 0x0, 0xfe, 0x7, 0xc0, 0x5, - 0xff, 0xff, 0x53, 0x46, 0x0, 0xff, 0x8c, 0x5, 0xff, 0xff, 0x91, 0x72, - 0x0, 0xfe, 0x6, 0xb2, 0x5, 0xff, 0xff, 0xb0, 0x46, 0x0, 0xff, 0x7b, - 0x5, 0xff, 0xfe, 0xe2, 0xe, 0x71, 0x0, 0xfe, 0xe, 0xbb, 0x5, 0xff, - 0xfe, 0xe4, 0x17, 0x44, 0x0, 0xfe, 0x1, 0x8d, 0x5, 0xff, 0xfe, 0xfa, - 0x3d, 0x72, 0x0, 0xff, 0xb6, 0x5, 0xff, 0xfe, 0xf6, 0x35, 0x45, 0x0, - 0xff, 0x7a, 0x6, 0xff, 0xff, 0x69, 0x73, 0x0, 0xff, 0x72, 0x4, 0xff, - 0xfe, 0xfa, 0x47, 0x46, 0x0, 0xff, 0x35, 0x5, 0xff, 0xff, 0x7d, 0x74, - 0x0, 0xfe, 0xc, 0xee, 0x2, 0xff, 0xfe, 0xf6, 0x4b, 0x48, 0x0, 0xff, - 0xbd, 0x3, 0xff, 0xff, 0x7f, 0x76, 0x0, 0xfc, 0x84, 0xff, 0xeb, 0x3a, - 0x49, 0x0, 0xfc, 0x46, 0xff, 0xfb, 0x66, 0x77, 0x0, 0xfd, 0x15, 0xc4, - 0x1f, 0x4b, 0x0, 0xfe, 0xba, 0x40, 0x48, 0x0}; -static const Image kaspersky_logo_image = {200, 43, 3548, kaspersky_logo_data}; - -const VariantAnimation kaspersky_logo = { - 21, - { - {28, 11, 25, 0, &kaspersky_logo_image}, - {28, 11, 25, 5, &kaspersky_logo_image}, - {28, 11, 25, 10, &kaspersky_logo_image}, - {28, 11, 25, 15, &kaspersky_logo_image}, - {28, 11, 25, 20, &kaspersky_logo_image}, - {28, 11, 25, 25, &kaspersky_logo_image}, - {28, 11, 25, 30, &kaspersky_logo_image}, - {28, 11, 25, 35, &kaspersky_logo_image}, - {28, 11, 25, 40, &kaspersky_logo_image}, - {28, 11, 25, 45, &kaspersky_logo_image}, - {28, 11, 25, 50, &kaspersky_logo_image}, - {28, 11, 25, 55, &kaspersky_logo_image}, - {28, 11, 25, 60, &kaspersky_logo_image}, - {28, 11, 25, 65, &kaspersky_logo_image}, - {28, 11, 25, 70, &kaspersky_logo_image}, - {28, 11, 25, 75, &kaspersky_logo_image}, - {28, 11, 25, 80, &kaspersky_logo_image}, - {28, 11, 25, 85, &kaspersky_logo_image}, - {28, 11, 25, 90, &kaspersky_logo_image}, - {28, 11, 25, 95, &kaspersky_logo_image}, - {28, 11, 25, 100, &kaspersky_logo_image}, - }}; -const VariantAnimation kaspersky_logo_reversed = { - 21, - { - {28, 11, 25, 100, &kaspersky_logo_image}, - {28, 11, 25, 95, &kaspersky_logo_image}, - {28, 11, 25, 90, &kaspersky_logo_image}, - {28, 11, 25, 85, &kaspersky_logo_image}, - {28, 11, 25, 80, &kaspersky_logo_image}, - {28, 11, 25, 75, &kaspersky_logo_image}, - {28, 11, 25, 70, &kaspersky_logo_image}, - {28, 11, 25, 65, &kaspersky_logo_image}, - {28, 11, 25, 60, &kaspersky_logo_image}, - {28, 11, 25, 55, &kaspersky_logo_image}, - {28, 11, 25, 50, &kaspersky_logo_image}, - {28, 11, 25, 45, &kaspersky_logo_image}, - {28, 11, 25, 40, &kaspersky_logo_image}, - {28, 11, 25, 35, &kaspersky_logo_image}, - {28, 11, 25, 30, &kaspersky_logo_image}, - {28, 11, 25, 25, &kaspersky_logo_image}, - {28, 11, 25, 20, &kaspersky_logo_image}, - {28, 11, 25, 15, &kaspersky_logo_image}, - {28, 11, 25, 10, &kaspersky_logo_image}, - {28, 11, 25, 5, &kaspersky_logo_image}, - {28, 11, 25, 0, &kaspersky_logo_image}, - }}; - -const VariantAnimation kaspersky_screensaver = { - 112, - { - {28, 11, 125, 60, &kaspersky_logo_image}, - {29, 11, 125, 60, &kaspersky_logo_image}, - {30, 11, 125, 60, &kaspersky_logo_image}, - {31, 11, 125, 60, &kaspersky_logo_image}, - {32, 11, 125, 60, &kaspersky_logo_image}, - {33, 11, 125, 60, &kaspersky_logo_image}, - {34, 11, 125, 60, &kaspersky_logo_image}, - {35, 11, 125, 60, &kaspersky_logo_image}, - {36, 11, 125, 60, &kaspersky_logo_image}, - {37, 11, 125, 60, &kaspersky_logo_image}, - {38, 11, 125, 60, &kaspersky_logo_image}, - {39, 11, 125, 60, &kaspersky_logo_image}, - {40, 11, 125, 60, &kaspersky_logo_image}, - {41, 11, 125, 60, &kaspersky_logo_image}, - {42, 11, 125, 60, &kaspersky_logo_image}, - {43, 11, 125, 60, &kaspersky_logo_image}, - {44, 11, 125, 60, &kaspersky_logo_image}, - {45, 11, 125, 60, &kaspersky_logo_image}, - {46, 11, 125, 60, &kaspersky_logo_image}, - {47, 11, 125, 60, &kaspersky_logo_image}, - {48, 11, 125, 60, &kaspersky_logo_image}, - {49, 11, 125, 60, &kaspersky_logo_image}, - {50, 11, 125, 60, &kaspersky_logo_image}, - {51, 11, 125, 60, &kaspersky_logo_image}, - {52, 11, 125, 60, &kaspersky_logo_image}, - {53, 11, 125, 60, &kaspersky_logo_image}, - {54, 11, 125, 60, &kaspersky_logo_image}, - {55, 11, 125, 60, &kaspersky_logo_image}, - {54, 11, 125, 60, &kaspersky_logo_image}, - {53, 11, 125, 60, &kaspersky_logo_image}, - {52, 11, 125, 60, &kaspersky_logo_image}, - {51, 11, 125, 60, &kaspersky_logo_image}, - {50, 11, 125, 60, &kaspersky_logo_image}, - {49, 11, 125, 60, &kaspersky_logo_image}, - {48, 11, 125, 60, &kaspersky_logo_image}, - {47, 11, 125, 60, &kaspersky_logo_image}, - {46, 11, 125, 60, &kaspersky_logo_image}, - {45, 11, 125, 60, &kaspersky_logo_image}, - {44, 11, 125, 60, &kaspersky_logo_image}, - {43, 11, 125, 60, &kaspersky_logo_image}, - {42, 11, 125, 60, &kaspersky_logo_image}, - {41, 11, 125, 60, &kaspersky_logo_image}, - {40, 11, 125, 60, &kaspersky_logo_image}, - {39, 11, 125, 60, &kaspersky_logo_image}, - {38, 11, 125, 60, &kaspersky_logo_image}, - {37, 11, 125, 60, &kaspersky_logo_image}, - {36, 11, 125, 60, &kaspersky_logo_image}, - {35, 11, 125, 60, &kaspersky_logo_image}, - {34, 11, 125, 60, &kaspersky_logo_image}, - {33, 11, 125, 60, &kaspersky_logo_image}, - {32, 11, 125, 60, &kaspersky_logo_image}, - {31, 11, 125, 60, &kaspersky_logo_image}, - {30, 11, 125, 60, &kaspersky_logo_image}, - {29, 11, 125, 60, &kaspersky_logo_image}, - {28, 11, 125, 60, &kaspersky_logo_image}, - {27, 11, 125, 60, &kaspersky_logo_image}, - {26, 11, 125, 60, &kaspersky_logo_image}, - {25, 11, 125, 60, &kaspersky_logo_image}, - {24, 11, 125, 60, &kaspersky_logo_image}, - {23, 11, 125, 60, &kaspersky_logo_image}, - {22, 11, 125, 60, &kaspersky_logo_image}, - {21, 11, 125, 60, &kaspersky_logo_image}, - {20, 11, 125, 60, &kaspersky_logo_image}, - {19, 11, 125, 60, &kaspersky_logo_image}, - {18, 11, 125, 60, &kaspersky_logo_image}, - {17, 11, 125, 60, &kaspersky_logo_image}, - {16, 11, 125, 60, &kaspersky_logo_image}, - {15, 11, 125, 60, &kaspersky_logo_image}, - {14, 11, 125, 60, &kaspersky_logo_image}, - {13, 11, 125, 60, &kaspersky_logo_image}, - {12, 11, 125, 60, &kaspersky_logo_image}, - {11, 11, 125, 60, &kaspersky_logo_image}, - {10, 11, 125, 60, &kaspersky_logo_image}, - {9, 11, 125, 60, &kaspersky_logo_image}, - {8, 11, 125, 60, &kaspersky_logo_image}, - {7, 11, 125, 60, &kaspersky_logo_image}, - {6, 11, 125, 60, &kaspersky_logo_image}, - {5, 11, 125, 60, &kaspersky_logo_image}, - {4, 11, 125, 60, &kaspersky_logo_image}, - {3, 11, 125, 60, &kaspersky_logo_image}, - {2, 11, 125, 60, &kaspersky_logo_image}, - {1, 11, 125, 60, &kaspersky_logo_image}, - {0, 11, 125, 60, &kaspersky_logo_image}, - {0, 11, 125, 60, &kaspersky_logo_image}, - {1, 11, 125, 60, &kaspersky_logo_image}, - {2, 11, 125, 60, &kaspersky_logo_image}, - {3, 11, 125, 60, &kaspersky_logo_image}, - {4, 11, 125, 60, &kaspersky_logo_image}, - {5, 11, 125, 60, &kaspersky_logo_image}, - {6, 11, 125, 60, &kaspersky_logo_image}, - {7, 11, 125, 60, &kaspersky_logo_image}, - {8, 11, 125, 60, &kaspersky_logo_image}, - {9, 11, 125, 60, &kaspersky_logo_image}, - {10, 11, 125, 60, &kaspersky_logo_image}, - {11, 11, 125, 60, &kaspersky_logo_image}, - {12, 11, 125, 60, &kaspersky_logo_image}, - {13, 11, 125, 60, &kaspersky_logo_image}, - {14, 11, 125, 60, &kaspersky_logo_image}, - {15, 11, 125, 60, &kaspersky_logo_image}, - {16, 11, 125, 60, &kaspersky_logo_image}, - {17, 11, 125, 60, &kaspersky_logo_image}, - {18, 11, 125, 60, &kaspersky_logo_image}, - {19, 11, 125, 60, &kaspersky_logo_image}, - {20, 11, 125, 60, &kaspersky_logo_image}, - {21, 11, 125, 60, &kaspersky_logo_image}, - {22, 11, 125, 60, &kaspersky_logo_image}, - {23, 11, 125, 60, &kaspersky_logo_image}, - {24, 11, 125, 60, &kaspersky_logo_image}, - {25, 11, 125, 60, &kaspersky_logo_image}, - {26, 11, 125, 60, &kaspersky_logo_image}, - {27, 11, 125, 60, &kaspersky_logo_image}, - {28, 11, 125, 60, &kaspersky_logo_image}, - }}; - -VariantInfo kaspersky_svi __attribute__((section("variant_info"))) = { - .version = 1, - .name = "kaspersky", - .logo = &kaspersky_logo, - .logo_reversed = &kaspersky_logo_reversed, - .screensaver_timeout = ONE_SEC * 60 * 10, - .screensaver = &kaspersky_screensaver}; diff --git a/tools/variant/salt.c b/tools/variant/salt.c deleted file mode 100644 index e15134d0b..000000000 --- a/tools/variant/salt.c +++ /dev/null @@ -1,7 +0,0 @@ -#include "keepkey/variant/salt.h" - -#include "keepkey/board/timer.h" -#include "keepkey/board/variant.h" - -VariantInfo salt_svi - __attribute__((section("variant_info"))) = {VARIANTINFO_SALT}; diff --git a/unittests/board/CMakeLists.txt b/unittests/board/CMakeLists.txt index 81e294dec..a37d57905 100644 --- a/unittests/board/CMakeLists.txt +++ b/unittests/board/CMakeLists.txt @@ -15,7 +15,6 @@ target_link_libraries(board-unit kkboard kkboard.keepkey kkvariant.keepkey - kkvariant.salt kkboard trezorcrypto qrcodegenerator diff --git a/unittests/crypto/CMakeLists.txt b/unittests/crypto/CMakeLists.txt index 782549f28..44576e694 100644 --- a/unittests/crypto/CMakeLists.txt +++ b/unittests/crypto/CMakeLists.txt @@ -15,7 +15,6 @@ target_link_libraries(crypto-unit kkboard kkboard.keepkey kkvariant.keepkey - kkvariant.salt kkboard kkemulator qrcodegenerator diff --git a/unittests/firmware/CMakeLists.txt b/unittests/firmware/CMakeLists.txt index 647d72571..ea3a1a4cc 100644 --- a/unittests/firmware/CMakeLists.txt +++ b/unittests/firmware/CMakeLists.txt @@ -24,7 +24,6 @@ target_link_libraries(firmware-unit kkboard kkboard.keepkey kkvariant.keepkey - kkvariant.salt kkboard kkemulator trezorcrypto